Обзор библиотеки OpenSSL / Часть первая

Введение



OpenSSL — криптографический пакет с открытым исходным кодом для работы с SSL/TLS (SSL – secure socket layer/TLS – transport layer security) и сертификатами X.509. Позволяет создавать ключи RSA, DH, DSA и сертификаты X.509, подписывать их, формировать CSR и CRT. Также имеется возможность шифрования данных и тестирования SSL/TLS соединений.



Доступна для Microsoft Windows, большинства UNIX-like операционных систем (включая Solaris/OpenSolaris, Linux, Mac OS X и четырех операционных систем BSD с открытым исходным кодом), а также для OpenVMS. OpenSSL основана на SSLeay, написанной Эриком Янгом (Eric A. Young) и Тимом Хадсоном (Tim Hudson), которые неофициально закончили работать над ней в декабре 1998 года, когда они начали работать в проекте RSA Security.



OpenSSL поддерживает очень много различных стандартов сертификации, шифрования, хеширования, но использование данной команды достаточно сложно. Внутри OpenSSL существуют отдельные компоненты, отвечающие за то или иное действие, для получения списка доступных компонентов можно вызвать openssl с параметрами list-standart-commands. Можно также получить список доступных алгоритмов хеширования (list-message-digest-commands) и алгоритмов шифрования (list-cipher-commands).


Основные задачи OpenSSL


  • Создавать и управлять ключами RSA и DSA (rsa, dsa, dsaparam).
  • Создавать сертификаты формата x509, запросы на сертификацию, восстановление (x509, req, verify, ca, crl, pkcs12, pkcs7).
  • Зашифровывать данные с помощью симметрического или асимметрического шифрования (enc, rsautl).
  • Высчитывать хеши различных типов (dgst).
  • Работа с S/MIME (s/mime).
  • Проверка работы серверов и клиентов ssl (s_client, s_server).


Основные команды создания ключей

Рассмотрим основные команды, покрывающие задачи OpenSSL.


Создание rsa ключей

Для создания rsa ключей используется команда genrsa:


Синтаксис



openssl genrsa -out file [-des | -des3 | -idea] -rand file bits


Описание

Команда genrsa создаёт секретный ключ длиной bits в формате PEM, шифрует одним из алгоритмов des (56 бит), des3 (168 бит) или idea (128 бит). При выборе алгоритма шифрования будет запрошен пароль для шифрации создаваемого секретного ключа (если алгоритм не указан, то секретный ключ не шифруется, чего делать ни в коем случае нельзя для личных ключей, т.к. некоторые серверы требуют отсутствие шифрации для секретного ключа сервера).


Параметры

Опция -out говорит программе, что вывод нужно осуществлять в файл file (опция -out присутствует во множестве других компонентов openssl и используется аналогичным образом для указания выходного файла). Опция -rand указывает на файл(ы) разделённые “:”, из которых будут считываться данные для установки seed (зерна) генератора случайных чисел. Рекомендуется использовать какие-нибудь сложно угадываемые файлы, вроде /var/log/messages или /boot/vmlinuz. Кроме этого, можно указывать в качестве -rand файла EGD сокет, который обеспечивает генерацию определённого количества случайных байт, EGD доступен на узле www.lothar.com/tech/crypto/. Установка генератора случайных чисел производится на основании хеша -rand файла, поэтому можно указывать файлы различной длины, т.к. хеш все равно имеет фиксированное число бит.


Пример



Пример генерации 4096 битового секретного ключа RSA:

$ openssl genrsa -out /etc/openssl/key.pem -des3 -rand /var/log/messages 4096

Generating RSA private key

…..++*…++++++++*

Enter PEM passphrase:

Verify PEM passphrase:



После этого секретный ключ зашифровывается и записывается в файл (в текстовом виде). Вначале ключа указывается алгоритм шифрования.


Создание публичного rsa ключа



Для создания публичного rsa ключа на основе секретного используется команда openssl rsa. Даная команда имеет следующий формат:

openssl rsa -in filename -out file [-des | -des3 |-idea] -check -pubout



Утилита openssl rsa способна изменять пароль и алгоритм шифрования секретного ключа, будучи вызвана с параметром -in и -out. Если применить параметр -pubout, то в указанный файл -out будет записан публичный ключ, вычисленный на основе -in секретного ключа.



Например, создание публичного ключа на основании секретного:

$ openssl rsa -in /etc/openssl/key.pem -out /etc/openssl/pubkey.pem -pubout



Изменение пароля и алгоритма шифрования секретного ключа с des3 на idea:

$ openssl rsa -in /etc/openssl/key.pem -out /etc/openssl/key1.pem -idea


Создание dsa ключей



Для создания DSA ключей используется утилита openssl gendsa, аналогичная genrsa, но есть два отличия: во-первых, для ключей DSA нельзя прямо указывать длину в битах и, во-вторых, ключи DSA могут генерироваться согласно некоторым параметрам, записанным в файл paramfile утилитой openssl dsaparam.


Синтаксис



openssl dsaparam -rand file{s} -C -genkey -out file numbits,



где numbits — длина желаемого ключа, -С вывод на stdout кода на С для программной генерации DSA на основе необходимых параметров, а опция -genkey говорит, что в выходной файл, наряду с параметрами, дополнительно записывается созданный секретный ключ DSA, но нельзя его сразу же зашифровать, поэтому удобнее воспользоваться утилитой openssl gendsa, которая имеет схожий синтаксис с командой genrsa, но вместо числа бит указывается файл параметров, созданный dsaparam:



$ openssl gendsa -out /etc/openssl/dsakey.pem -rand /boot/vmlinuz -idea paramfile

Enter PEM passphrase:

Verify PEM passphrase:



Для управления ключами dsa используется программа openssl dsa, которая абсолютно аналогична (в параметрах) утилите openssl rsa. Генерация публичного DSA ключа:

$ openssl dsa -in /etc/openssl/dsakey.pem -out /etc/openssl/pubdsakey.pem -pubout


Основные команды шифрования и хеширования


Шифрование

Для выполнения симметрического шифрования используется утилита openssl enc -cipher, или её сокращённая запись openssl cipher, где cipher — это одно из символических имён симметрических шифров. Наиболее популярными являются следующие: base-64 (преобразование в текстовый вид), bf (blowfish — 128 бит), des (56 бит), des3 (168 бит), rc4 (128 бит), rc5 (128 бит), rc2 и idea (128 бит).

Для указания входного и выходного файлов используется опции -in и –out. Пароль для шифрования вводится с клавиатуры (можно указать в командной строке параметром -k, но это очень плохо по соображениям безопасности). Учтите, что пароль не спрашивается при обработке файла base64, т.к. шифрования не происходит. Для расшифровки зашифрованных данных применяется команда openssl cipher с опцией –d (алгоритм шифрования и дешифрования должен совпадать), а для одновременной обработки данных base64 можно воспользоваться опцией -a.



Шифрование по умолчанию происходит с подмешиванием, т.е. для выбора алгоритма подмешивания используется случайное значение salt, в этом случае, если вы шифруете один и тот же файл в разное время одним и тем же алгоритмом и паролем, то результаты, скорее всего, будут разными (это затрудняет атаку по словарю). Также по умолчанию используется cbc режим алгоритмов, когда ключ меняется в течение всего сеанса работы согласно передаваемым данным, этот приём очень сильно затрудняет брутфорс, т.к. атакующему сложно поймать нужный момент времени.


Примеры

Шифрование файла, используя алгоритм des3:

$ openssl des3 -in file -out file.des3

Дешифровка полученного файла:

$ openssl des3 -d -in file.des3 -out file



Шифрование файла, используя алгоритм blowfish(bf), и кодирование base64:

$ openssl bf -a -in file -out file.bf64 Дешифровка и обработка base64:

$ openssl bf -a -d -in file.bf64 -out file


Хеширование



Для вычисления хешей (их ещё называют отпечатками или контрольными суммами) используется команда openssl dgst -hashalg или краткая форма openssl hashalg (первая команда может также выполнять манипуляции с ЭЦП (электронная цифровая подпись)).

Обычное использование данной команды openssl hashalg [-c] file[s]. Вычисляется хеш сообщения фиксированной длины в виде одной строки или, если указана опция -c, строки, разделённой на пары HEX чисел двоеточием. Из алгоритмов хеширования могут применяться: md2 (128 бит), md4 (128 бит), md5 (128 бит), mdc2 (128 бит), sha (160 бит), sha1 (160 бит), ripemd160 (160 бит).


Примеры

Вычисление md5 хеш файла:

$ openssl md5 -c file

MD5(file)= 81:fd:20:ff:db:06:d5:2d:c3:55:b5:7d:3f:37:ac:94

SHA1 хеш этого же файла:

$ openssl sha1 file

SHA1(file)= 13f2b3abd8a7add2f3025d89593a0327a8eb83af



Утилита openssl dgst может использоваться для подписывания сообщения секретным ключом и проверки ЭЦП публичным ключом. Для этого используется следующий синтаксис:

$ openssl dgst -sign private_key -out signature -hashalg file[s]



Подписывание file с помощью секретного ключа private_key, используя алгоритм хеширования hashalg (обычно применяются sha1 или md5).

$ openssl dgst -signature signature -verify public_key file[s]



Проверка подписи в file, используя публичный ключ public_key и ЭЦП signature. Данная программа выводит “Verification OK” при правильной подписи или “Verification Failure” в любом другом случае. Учтите, что ЭЦП в таком случае хранится отдельно от файла, который ею подписан.

Для шифрации и дешифрации RSA алгоритмом используется программа rsautl. Данная утилита имеет также возможность подписывать и проверять подпись сообщений (однако работать всё равно приходится с хешем сообщения, т.к. подписывать можно только небольшой объём данных, по этой причине лучше применять openssl dgst). Для шифрации/дешифрации используется следующий синтаксис:



$ openssl rsautl -in infile -out outfile -keyin pubkey -pubin -encrypt / -decrypt



Шифрация file с использованием публичного ключа pubkey.pem



$ openssl rsautl -in file -out file.cr -keyin pubkey.pem -pubin -encrypt



Дешифрация file.cr с использованием секретного ключа secretkey.pem



$ openssl rsautl -in file.cr -out file -keyin secretkey.pem -decrypt


Основные сертификаты, s/mime



OpenSSL имеет возможность генерировать сертификаты, управлять ЭЦП и шифрованием с помощью сертификатов. Применение утилит управления сертификатами — достаточно сложная задача.


О сертификатах



Сертификат содержит публичный ключ, подписанный одним из корневых доверенных центров сертификации (или комплементарным секретным ключом), данные об организации, выдавшей сертификат и в некоторых случаях зашифрованный секретный ключ, а также отпечаток (хеш) публичного ключа. Сертификаты имеют время действия, по окончанию которого они автоматически считаются недействительными, иерархия сертификатов обычно строится на основании сети доверия (бывают довольно длинные цепочки сертификатов, ведущие к доверенному ключу из root CA). Таким образом, сертификат — это полный комплекс системы асимметрического шифрования, предоставляющий гораздо больше возможностей, чем сами по себе ключи (а также являющийся более защищённой системой). Основным привлекательным моментом сертификата является возможность записи в него информации об организации, этот ключ выдавшей.



Общее содержание сертификатов определено стандартом x509, в то время как форматы записей сертификатов могут внести некоторую путаницу. OpenSSL по умолчанию использует формат PKCS#10, Microsoft использует по умолчанию формат PKCS#12 (в руководстве по openssl этот формат охарактеризован, как один большой баг), формат PKCS#7 используется для запросов на сертификацию к CA (центр сертификации) и не может содержать секретного ключа, также для этой цели может использоваться DER закодированный сертификат (DER кодирование подобно кодированию base64, но имеет специальное назначение для использования в криптографических системах) также без секретного ключа. Учтите, что при использовании DER формата убираются маркеры начала и конца сертификата, а его содержимое кодируется base64, поэтому в файле DER можно хранить только один сертификат, с другой стороны DER сертификаты поддерживаются MS (стандартное расширение .cer), поэтому иногда бывает нужно преобразовать сертификаты из одного формата в другой:



PEM→DER: $ openssl x509 -inform PEM -in cert.pem -outform DER -out cert.cer

DER→PEM: $ openssl x509 -inform DER -in cert.cer -outform PEM -out cert.pem



Таким же образом можно конвертировать и ключи асимметрического шифрования (используя утилиты rsa или dsa).


Список использованных источников


  1. Официальный сайт OpenSSL: www.openssl.org/
  2. Использование OpenSSL: www.opennet.ru/base/sec/openssl.txt.html
  3. Вопросы и ответы по OpenSSL: xgu.ru/wiki/OpenSSL
  4. Сертификат на основе эллиптических кривых: habrahabr.ru/blogs/crypto/96190/
  5. OpenSSL на Википедии: ru.wikipedia.org/wiki/Openssl



Продолжение meego.e-werest.org/blog/2902.html



Kirill Yudenok