Openssl windows как пользоваться

Обновлено: 07.07.2024


OpenSSL — универсальный криптографический инструмент, построенный вокруг протоколов SSL/TLS и сертификатов X.509.

Помимо того, что этот инструмент позволяет работать с соединениями SSL/TLS, сертификатами X.509, он может делать множество других полезных вещей: шифровать и расшифровывать файлы, создавать и проверять цифровые подписи, проверять числа на простоту, тестировать производительность компьютера и другое.

Содержание

Вопросы и ответы

Раздел написан на основе OpenSSL Command-Line HOWTO [1]

Введение

Как определить какую версию OpenSSL я использую?

Использовать опцию version:

Расширенная информация с опцией -a:

Как получить список доступных команд?

Вызвать с неправильным ключом (например, help или -h).

Аналогично с подкомандами:

Как посмотреть список доступных шифров?

Использовать команду ciphers:

Измерение производительности

Как измерить производительность системы с помощью openssl?

Пример для 2.16GHz Intel Core 2.

Каждый тест можно вызывать отдельно:

Как измерить производительность сетевого соединения?

Помимо этого простейшего измерения у подкоманды s_time есть множество других возможностей:

Сэмулировать web-сервер с помощью openssl s_server:

Сертификаты

Как сгенерировать самоподписной сертификат?

Создать файл mycert.pem, в котором будет и секретный ключ и открытый сертификат, основанный на нём. Сертификат будет действителен в течение 365 дней; ключ (благодаря опции -nodes) будет нешифрованным.

После вызова команды надо будет ответить на несколько вопросов: Country Name, State, City и так далее. На вопрос “Common Name” нужно отвечать именем сервера, по которому будут обращаться люди.

Как сгенерировать запрос сертификата у VeriSign?

Секретный ключ в файле mykey.pem и запрос на сертификат myreq.pem:

Если ключ уже есть, и его надо использовать только для генерации сертификата, используется команда попроще:

Или, с информацией для сертификата прямо в командной строке:

Не допускайте ошибок в названиях! Каждый символ важен.

Файл с ключом нужно сохранить в надёжном месте.

Как проверить новый сертификат?

Подкоманда s_server предоставляет простой, но эффективный метод тестирования. В примерах ниже предполагается, что ключ и сертификат хранятся в файле mycert.pem.

Запустите тестовый сервер на машине, на которой будет использоваться сертификат. По умолчанию, открывается порт 4433; другой порт можно задать опцией -accept.

Как получить удалённый сертификат?

С помощью openssl и sed:

Можно вернуть данные openssl, например, для того чтобы выяснить, для каких дат он действителен:

Как извлечь какую-либо информацию из сертификата?

В SSL-сертификате есть много информации, в частности:

  • кто выдал сертификат (issuer);
  • насколько долго он действителен (valid dates);
  • получатель сертификата (subject);
  • разнообразная криптографическая информация.

Опция текст даёт весь объём информации:

Другие опции дают другую информацию:

Извлечение открытого ключа, который требуется для проверки цифровой подписи (дайджеста):

Превратить pfx в pem:

Проверка сертификата

Приложения, слинкованные с библиотеками OpenSSL, могут проверять подлинность сертификатов, выданных сервером сертификатов (certificate authority, CA).

Как проверить сертификат?

Использовать подкоманду verify:

  • error 10 at 0 depth lookup:certificate has expired. Время действия сертификата истекло.
  • error 18 at 0 depth lookup:self signed certificate. Если не указать явным образом, openssl не будет проверять самоподписные сертификаты (self-signed certificate).

Какие центры сертификации распознаёт OpenSSL?

При сборке OpenSSL в нём настраивается местоположение OpenSSL-файлов (Directory for OpenSSL files). Этот параметр задаётся опцией --openssldir, передающейся конфигурационному скрипту. В этом каталоге, как правило, хранится информация о центрах сертификации, которым доверяет система.

По умолчанию, этот каталог находится в /usr/local/ssl, но большинство сборщиков размещает его в других местах, таких как /etc/pki/tls (Red Hat/Fedora), /etc/ssl (Gentoo), /usr/lib/ssl (Debian) или /System/Library/OpenSSL (Macintosh OS X).

Посмотреть, какой именно каталог используется в конкретной инсталляции, можно с помощью опции version(параметр OPENSSLDIR):

Внутри данного каталога есть подкаталог certs/, в котором находятся файлы трёх разных типов:

  1. Большой файл под названием cert.pem, объёмистый сборник многих сертификатов от признанных общеизвестных центров сертификации, таких как VeriSign и Thawte.
  2. Множество маленьких файлов с расширением .pem, каждый из которых содержит сертификат от отдельного центра сертификации;
  3. Символические ссылки в со странными именами вида 052eae11.0. Как правило, для каждого .pem-файла есть такая ссылка.

Первая часть странного имени ссылки — это, на самом деле, хэш, основанный на сертификате внутри .pem-файла, на который эта ссылка указывает. Расширение файла это итератор (то есть, номер), поскольку теоретически возможно, что разные сертификаты укажут на одинаковый хэш.

Например, ссылка f73e89fd.0 указывает на файл vsignss.pem. Значит, сертификат соответствует хэшу, который равен имени ссылки:

Когда приложение получает удалённый сертификат, оно сначала проверяет, есть ли этот сертификат в cert.pem и, если нет, смотрит в файле, соответствующем хэшу сертификата. Если такой файл найден, сертификат считается верным.

Нужно иметь в виду, что некоторые приложения, такие как Sendmail, например, позволяют во время исполнения указывать местоположение сертификатов, а некоторые, например Pine, нет.

Как мне заставить OpenSSL признавать сертификат?

Сертификат, которому нужно доверять, должен быть размещён в каталоге certs/. После этого необходимо создать хэшированную символическую ссылку на него. Вот небольшой скрипт, который делает это:

Клиенты и серверы для командной строки

Подкоманды s_client и s_server предоставляют возможность для запуска SSL-клиентов для командной строки.

Как подключиться к безопасному SMTP-серверу?

С помощью подкоманды s_client можно проверить или даже использовать SMTP-сервер с поддержкой SSL.

Безопасные SMTP-серверы могут предлагать безопасные соединения на портах: 25 (TLS), 465 (SSL) и 587 (TLS). Где-то в районе релиза 0.9.7 у openssl появилась возможность использовать STARTTLS в ходе общения с SMTP-серверами.

Чтобы использовать для обозначения конца строки именно CRLF, а не CR или LF, используется опция -crlf. Это важно особенно для Qmail.

Как подключиться к [какому-либо] безопасному серверу?

На момент написания openssl поддерживал TLS из командной строки только с SMTP, поэтому для других протоколов нужно использовать прямые SSL-соединения.

Как запустить SSL-сервер из командной строки?

Подкоманда s_server позволяет запустить сервер с поддержкой SSL прямо из командной строки; сервер предназначен только для проверки и отладки. Для полноценной работы рекомендуется использовать stunnel.

Подкоманда s_server работает намного лучше, если есть сертификат; когда его нет, её возможности сильно сокращаются.

Дайджесты

Создание дайджестов (криптографических контрольных сумм) с помощью подкоманды dgst — одна из наиболее распространённых задач, выполняемых с помощью openssl.

Как создавать дайджесты MD5 или SHA1?

Дайджесты создаются с помощью подкоманды dgst:

Дайджест MD5 эквивалентен дайджесту, создаваемому известной утилитой md5sum, хотя выводится в другом формате:

То же верно и для дайджестов SHA1 и программы sha1sum:

Как подписать дайджест?

Для того, чтобы быть уверенным, что дайджест никто не изменял, его можно подписать с помощью своего закрытого ключа.

Подписать дайджест SHA1 для файла foo-1.23.tar.gz:

Как проверить подписанный дайджест?

Для того чтобы проверить правильность дайджеста, нужен файл, на основе которого был получен дайджест, сам подписанный дайджест и открытый ключ того, кто подписывал дайджест:

Как создать запись типа digest для файла паролей Apache?

Формат базы паролей прост: список нескольких полей, разделённых двоеточиями. Поля:

  • имя пользователя (username);
  • область авторизации (authorization realm; AuthRealm);
  • MD5-суммы для этих полей и пароля.

Скрипт, представленный ниже, повторяет действие htdigest с той разницей, что выводит данные на стандартный поток вывода. Кроме того, он умеет считывать данные со стандартного потока ввода.

Какие ещё есть дайджесты?

Подкоманда list-message-digest-commands даёт список типов дайджестов, доступных в данной инсталляции.

Шифрование/расшифровка

Как закодировать что-то по методу base64?

Использовать опцию -base64.

Закодировать одну строку:

Без перевода строки (важно для паролей):

Опция -d выполняет обратный процесс (то есть, раскодирование):

Как зашифровать файл?

Простое шифрование файлов, вероятно, лучше делать инструментами типа GPG. Тем не менее, иногда может возникнуть необходимость зашифровать файл без развёртывания инфраструктуры ключей и сертификатов, а пользуясь одним только паролем. Второе, что нужно будет запомнить — это шифр, с помощью которого выполнялось шифрование.

Список поддерживаемых шифров есть на странице enc(1). Более просто (и более точно) узнать этот список у самой программы openssl.

Расшифровка файла на стороне получателя:

Можно не вводить парольную фразу постоянно при шифровании и расшифровке, а передавать её автоматически (подробнее: openssl(1); раздел "PASS PHRASE ARGUMENTS"). Формат аргумента прост:

Ошибки

В системных журналах обнаружились строки, которые, похоже, имеют отношение к OpenSSL или crypto:

В первом приближении определить, что не так, можно с помощью подкоманды errstr, которая умеет интерпретировать код ошибки. Код ошибки находится между "error:" и ":lib". В данном случае это 0407006A.

Ключи

Как сгенерировать ключ RSA?

Использовать подкоманду genrsa:

Как сгенерировать открытый ключ RSA?

С помощью подкоманды rsa можно создать открытую версию для закрытого ключа RSA:

Как сгенерировать ключ DSA?

Для построения ключей DSA нужен специальный файл параметров (parameter file), кроме того, операции с DSA медленнее чем аналогичные операции с RSA, в связи с этим, DSA используется не так часто, как RSA.

Если нужно сгенерировать только один ключ DSA, то это можно сделать одной командой, с помощью подкоманды dsaparam:

Если же нужно создавать несколько ключей DSA, перед тем как их генерировать, можно сделать общий файл параметров. Файл параметров генерируется сравнительно медленно, а файлы ключей очень быстро.

Как создать ключ, основанный на эллиптических кривых (elliptic curve key)?

Процедуры для работы с эллиптическими кривыми были добавлены в openssl, начиная с версии 0.9.8. Работа с этими процедурами выполняется через подкоманду ecparam.

Как создать открытый EC ключ?

С помощью подкоманды ec можно создать открытую версию для закрытого ключа EC (elliptic curve):

Как удалить парольную фразу у ключа?

Каждый раз, когда запускается демон, использующий ключ, надо будет набирать парольную фразу. Её можно убрать.

Допустим, ключ, зашифрованный парольной фразой, находится в файле key.pem; после выполнения команды расшифрованный ключ будет в newkey.pem:

Если закрытый ключ (private key) и открытый сертификат хранятся в одном файле, нужно будет выполнить две команды:

Хэши для паролей

С помощью подкоманды passwd можно генерировать хэши паролей, которые совместимы со стандартными хэшами из /etc/passwd, /etc/shadow или файла паролей Apache.

Как сгенерировать хэш в стиле crypt?

Сгенерировать хэш очень просто:

Если salt для пароля известен, можно воссоздать хэш.

Как сгенерировать хэш пароля в стиле shadow?

В новых UNIX/Linux-системах вместо старого crypt-хэша используется новый, более стойкий хэш MD5. Его генерирование выполняется с помощью ключа -1:

В этом формате salt состоит из 8 символов; он находится между вторым и третьим знаком $, в данном случае это sXiKzkus.

Простые числа

Поскольку openssl активно использует механизмы для работы с простыми числами, не удивительно, что в нём есть соответствующие процедуры. Начиная с версии 0.9.7e (или где-то так), в openssl появилась подкоманда binary.

Как проверить, является ли число простым?

Передать число как аргумент к подкоманде prime. Результат будет не в десятичном, а в шестнадцатеричном виде.

Можно проверять и шестнадцатеричные числа:

Как сгенерировать набор простых чисел?

Сгенерировать множество чисел и оставить только простые среди них. Для генерирования последовательностей удобно использовать seq.

Случайные данные

Как генерировать случайные данные?

Используйте подкоманду rand.

На UNIX/Linux-системах, в которых есть файл /dev/urandom, похожего эффекта можно добиться иначе, и иногда с лучшим результатом даже:

Между устройствами random и urandom есть разница. Дополнительная информация в random(4) для Linux и BSD или random(7D) для Solaris.

S/MIME

Много хороших примеров есть в smime(1).

Если сертификат не опознан, возникнет похожая ошибка:

Если нужно вытащить сертификат автора письма, для того, чтобы использовать его в дальнейшем, то нужна только первая часть команды:

Дальше этот сертификат можно или интегрировать в инфраструктуру OpenSSL, или сохранить его для будущего использования, например, такого:

Для того чтобы получить шифрование по умолчанию RC2-40 (оно, правда, слабое), нужно только сказать 'openssl, где находится сертификат:

Если есть уверенность, что на удалённой стороне есть современная поддержка SSL, можно использовать алгоритм шифрования посильнее чем DES:

Одним из самых популярных инструментов для создания и управления SSL-сертификатами является библиотека OpenSSL. В этой статье я расскажу о часто используемых командах OpenSSL.

Некоторые аббревиатуры, относящиеся к сертификатам:

  • SSL – Secure Socket Layer (уровень защищённых cокетов).
  • CSR – Certificate Signing Request (запрос на получение сертификата).
  • TLS – Transport Layer Security (протокол защиты транспортного уровня).
  • PEM – Privacy Enhanced Mail (формат файлов для хранения и отправки криптографических ключей).
  • SHA – Secure Hash Algorithm (алгоритм криптографического хеширования).
  • PKCS – Public-Key Cryptography Standards (стандарты криптографии с открытым ключом).

1. Создание нового секретного ключа и запрос на получение сертификата

2. Создание самозаверяемого сертификата

Пример: для получения сертификата, действительного два года.

3. Верификация CSR-файла

Верификация необходима, чтобы отправленный в регистрационный центр CSR-файл содержал всю необходимую информацию.

4. Создание секретного RSA-ключа

Если нужно создать секретный RSA-ключ, используйте приведенную выше команду.

5. Удаление пароля-фразы из ключа

Если вы используете составной пароль (фразу) в файле ключа и работаете на Apache, то при каждом запуске нужно вводить секретную фразу. Если вас это раздражает, то можно использовать приведенную выше команду, чтобы удалить пароль-фразу из существующего ключа.

6. Верификация секретного ключа

Если вы сомневаетесь в файле ключа, то можете использовать данную команду.

7. Верификация файла сертификата

Если хотите проверить данные сертификата, такие как CN, OU и т.д., используйте приведенную выше команду, которая предоставит данные сертификата.

8. Верификация центра сертификации

Для проверки центра сертификации можно использовать приведенную выше команду.

9. Проверка хеш-значения сертификата

10. Преобразование формата DER в PEM

Центр сертификации предоставляет SSL-сертификат в формате .der . Если вам необходимо использовать его в формате apache или .pem , примените приведенную выше команду для соответствующего преобразования.

11. Преобразование формата PEM в DER

Если необходимо изменить формат .pem на .der .

Совет. Вы также можете включить цепочку сертификатов, передав параметр -chain, как показано в примере ниже.

13. Создание CSR с использованием существующего секретного ключа

Если не хотите создавать новый секретный ключ вместо существующего, выполните приведенную выше команду.

14. Проверка содержимого сертификата в формате PKCS12

PKCS12 является двоичным форматом, поэтому вы не сможете просмотреть его содержимое в текстовом редакторе. Для просмотра файла в формате PKCS12 используйте приведенную выше команду.

15. Преобразование формата PKCS12 в PEM-сертификат

Если нужно использовать существующий файл в формате pkcs12 на Apache или только в формате pem , в этом поможет приведенная выше команда.

16. Проверка SSL-сертификата определенного URL-адреса

Я часто использую эту команду для проверки SSL-сертификата URL-адреса. Это удобно для проверки данных протокола, шифрования и сертификата.

17. Определение версии OpenSSL

18. Проверка даты истечения срока действия PEM-файла

19. Проверка срока действия SSL-сертификата для URL-адреса

Команда позволяет контролировать дату истечения срока действия SSL- сертификата удаленно или для конкретного URL-адреса.

20. Проверка, принимается ли на URL-адресеSSL V2 или V

Чтобы проверить SSL V2:

Чтобы проверить SSL V3:

Чтобы проверить TLS 1.0:

Чтобы проверить TLS 1.1:

Чтобы проверить TLS 1.2:

21. Проверка того, принимается ли конкретный шифр на URL-адресе

Если хотите знать, принимаются ли некоторые слабые шифры, то можете использовать приведенную выше команду.

Надеюсь, что приведенные выше команды помогли вам узнать больше об использовании OpenSSL для управления SSL-сертификатами.

Дайте знать, что вы думаете по данной теме материала в комментариях. За комментарии, отклики, подписки, лайки, дизлайки огромное вам спасибо!

Пожалуйста, оставьте свои комментарии по текущей теме статьи. Мы крайне благодарны вам за ваши комментарии, подписки, лайки, отклики, дизлайки!

Скорее всего, вы уже знакомы с OpenSSL как с библиотекой, которая дает возможность работать по протоколу SSL. Помимо библиотеки в составе OpenSSL идет полезная утилита для работы с командной строкой, которая используется при администрировании SSL/PKI. Сам этот инструмент плохо задокументирован, и цель данной статьи - немного рассказать о полезных советах и трюках по работе с OpenSSL в виде «поваренной книги».

image

Автор: Джошуа Дэвис (Joshua Davies)

Скорее всего, вы уже знакомы с OpenSSL как с библиотекой, которая дает возможность работать по протоколу SSL. Помимо библиотеки в составе OpenSSL идет полезная утилита для работы с командной строкой, которая используется при администрировании SSL/PKI. Сам этот инструмент плохо задокументирован, и цель данной статьи - немного рассказать о полезных советах и трюках по работе с OpenSSL в виде «поваренной книги».

Получение справки о подкомандах OpenSSL

Утилита для работы с командной строкой в OpenSSL является оболочкой для многих «подпрограмм». Для запуска нужной подпрограммы необходимо указать ее имя (например, ca, x509, asn1parse и т. д.) В документации по OpenSSL о подпрограммах сказано не особо много, однако на каждую такую подкоманду есть отдельная страница с документацией. Например, чтобы получить справку о подпрограмме openssl x509, наберите следующую команду:

Просмотр необработанной структуры ASN.1 файла

Протокол SSL является реализацией PKI (Public Key Infrastructure, Инфраструктура Открытых Ключей) и как таковой работает непосредственно с сертификатами. Можно с уверенностью сказать, если при настройке SSL возникли какие-то проблемы, то с 90% вероятностью дело в неправильно сконфигурированном сертификате. Сертификаты (или, если быть более точным, X.509 сертификаты) описываются формальным языком «ASN.1» (или Abstract Syntax Notation (.1)), в чем-то схожим с XML или JSON. Существует довольно много файлов, связанных с сертификатами, и нет никаких стандартов относительно их имен или расширений. Когда файл сертификата обнаружен, просмотр необработанной структуры (raw structure) может помочь в поиске проблемы. Однако если открыть файл сертификата, скажем, в текстовом редакторе, то можно увидеть нечто подобное:

MIICbDCCAioCAQAwaDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlRYMQ4wDAYDVQQHEwVQbGFubzER
MA8GA1UEChMIMnhvZmZpY2UxETAPBgNVBAsTCFJlc2VhcmNoMRYwFAYDVQQDEw1Kb3NodWEgRGF2
aWVzMIIBtzCCASwGByqGSM44BAEwggEfAoGBAP1/U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2
USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdrmVClpJ+f6AR7ECLCT7up1/63xhv4
O1fnxqimFQ8E+4P208UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHHAhUAl2BQjxUjC8yykrmC
ouuEC/BYHPUCgYEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCB
gLRJFnEj6EwoFhO3zwkyjMim4TwWeotUfI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhR
kImog9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoDgYQAAoGAOPlkQGq47HhKxmGBTDWaLaa140+Rl3b+
rZk3TpODy/BTS6O+v608EEBnJvF6ck26qFjLBHPC8IihovdcczKEAofIiR+do7CMjUEWdWIFnwKX
6W46ElBJN1ieWl1HtGj5RXnSfcfitiRGOiee1jsyV7wVn0Y4/8vbYPAUFRSPpk2gADALBgcqhkjO
OAQDBQADLwAwLAIUFgkt1lvVhcR1JE6wW7pyBAsgA1wCFHcSuOTaZdIM/dKwJ5dOFgsK0zOi

Файл закодирован по схеме Base64, но раскодировка не даст сколь-нибудь полезных результатов, поскольку в Base64 закодировано представление по стандарту DER (Distinguished Encoding Rule). Чтобы получить нечто более осмысленное, необходимо воспользоваться подкомандой asn1parse:

$ openssl asn1parse -in mysterious_file.pem

Результат выполнения подпрограммы:

0:d=0 hl=4 l= 620 cons: SEQUENCE
4:d=1 hl=4 l= 554 cons: SEQUENCE
8:d=2 hl=2 l= 1 prim: INTEGER :00
11:d=2 hl=2 l= 104 cons: SEQUENCE
13:d=3 hl=2 l= 11 cons: SET
15:d=4 hl=2 l= 9 cons: SEQUENCE
17:d=5 hl=2 l= 3 prim: OBJECT :countryName
22:d=5 hl=2 l= 2 prim: PRINTABLESTRING :US
26:d=3 hl=2 l= 11 cons: SET
28:d=4 hl=2 l= 9 cons: SEQUENCE
30:d=5 hl=2 l= 3 prim: OBJECT :stateOrProvinceName
35:d=5 hl=2 l= 2 prim: PRINTABLESTRING :TX
39:d=3 hl=2 l= 14 cons: SET
41:d=4 hl=2 l= 12 cons: SEQUENCE
43:d=5 hl=2 l= 3 prim: OBJECT :localityName
48:d=5 hl=2 l= 5 prim: PRINTABLESTRING :Plano
55:d=3 hl=2 l= 17 cons: SET
57:d=4 hl=2 l= 15 cons: SEQUENCE
59:d=5 hl=2 l= 3 prim: OBJECT :organizationName
64:d=5 hl=2 l= 8 prim: PRINTABLESTRING :2xoffice
74:d=3 hl=2 l= 17 cons: SET
76:d=4 hl=2 l= 15 cons: SEQUENCE
78:d=5 hl=2 l= 3 prim: OBJECT :organizationalUnitName
83:d=5 hl=2 l= 8 prim: PRINTABLESTRING :Research
93:d=3 hl=2 l= 22 cons: SET
95:d=4 hl=2 l= 20 cons: SEQUENCE
97:d=5 hl=2 l= 3 prim: OBJECT :commonName
102:d=5 hl=2 l= 13 prim: PRINTABLESTRING :Joshua Davies
117:d=2 hl=4 l= 439 cons: SEQUENCE
121:d=3 hl=4 l= 300 cons: SEQUENCE
125:d=4 hl=2 l= 7 prim: OBJECT :dsaEncryption
134:d=4 hl=4 l= 287 cons: SEQUENCE
138:d=5 hl=3 l= 129 prim: INTEGER :FD7F53811D75122952DF4A9C2.
270:d=5 hl=2 l= 21 prim: INTEGER :9760508F15230BCCB292B982A.
293:d=5 hl=3 l= 129 prim: INTEGER :F7E1A085D69B3DDECBBCAB5C3.
425:d=3 hl=3 l= 132 prim: BIT STRING
560:d=2 hl=2 l= 0 cons: cont [ 0 ]
562:d=1 hl=2 l= 11 cons: SEQUENCE
564:d=2 hl=2 l= 7 prim: OBJECT :dsaWithSHA1
573:d=2 hl=2 l= 0 prim: NULL
575:d=1 hl=2 l= 47 prim: BIT STRING

Если вы немного знакомы с концепцией PKI, то, возможно, уже догадались, что это ни что иное как запрос на подпись сертификата. В недавних версиях OpenSSL появился параметр –i, используемый подкомандой asn1parse и отвечающий за глубину парсинга, что может быть полезно при анализе больших структур (например, цепочек сертификатов).

Работа с PEM-файлами и файлами, закодированными по стандарту DER

В большинстве случаев команда openssl asn1parse -in file будет работать корректно с любыми файлами, имеющими отношение к SSL/PKI, однако иногда может возникать следующая ошибка:

$ openssl asn1parse -in request.der
Error: offset too large

Впервые термин PEM начал использоваться в проекте PGP (Pretty Good Privacy), который был особенно популярен в 90-х годах и направлен на защиту электронной почты. В то же время предпринималась попытка популяризировать стандарт IETF, где описывалась общая инфраструктура по шифрованию электронных писем. В настоящее время любой файл, закодированный в Base64 и имеющий отношение к сертификату, мы называем «закодированный по стандарту PEM», даже если он не предназначен для передачи конфиденциальной информации.

Предполагается, что любой объект, с которым взаимодействует OpenSSL, закодирован в Base64 и, следовательно, перед обработкой происходит его декодирование. Если необходимо обойти этот шаг, укажите параметр -inform der:

$ openssl asn1parse -inform der -in request.der
0:d=0 hl=4 l= 342 cons: SEQUENCE
4:d=1 hl=4 l= 256 cons: SEQUENCE
8:d=2 hl=2 l= 1 prim: INTEGER :00
.

Если и в этом случае возникает ошибка "offset too large", значит, файл либо не имеет отношение к сертификату, либо произошло его повреждение во время передачи.

Просмотр содержимого сертификата

Допустим, вы имеете дело с настоящим сертификатом стандарта X.509. Подпрограмма asn1parse во всех деталях расскажет о файле сертификата ( возможно, даже больше, чем вы ожидали). Вам же нужно узнать лишь срок действия и имя.

Для получения этой информации в OpenSSL предусмотрена подкоманда x509. Однако если использовать команду $ openssl x509 -in sample.cer, результат будет примерно таким:

-----BEGIN CERTIFICATE-----
MIIEszCCA5ugAwIBAgIJAMR0RhX+M2iEMA0GCSqGSIb3DQEBBQUAMIGXMQswCQYD
VQQGEwJVUzELMAkGA1UECBMCVFgxDjAMBgNVBAcTBVBsYW5vMREwDwYDVQQKEwgy
.
qRH8SwcC2/+kLp5/SqpC7Tv1K1466jrxltb4ncJL6Is8p2FDRn1GTLTj3Z086JgX
s9y/DGoyTw==
-----END CERTIFICATE-----

По сути, вышеуказанная команда вывела текстовое содержимое сертификата, так же как если бы вы использовали команду: $ cat sample.cer

Для того чтобы OpenSSL отобразил нечто осмысленное, необходимо указать корректные параметры, например:

-subject
Вывод имени сертификата
-issuer
Вывод имени эмитента сертификата
-dates
Вывод срока действия сертификата

По умолчанию вся информация о сертификате будет выведена после закодированного содержимого. Чтобы закодированное содержимое не выводилось, используйте команду –noout (логичнее было бы сделать использование этого параметра по умолчанию). Если нужно вывести всю общую информацию о сертификате (что требуется в большинстве случаев), используйте параметр –text.

X509v3 Basic Constraints:
CA:TRUE
Signature Algorithm: sha1WithRSAEncryption
56:32:44:76:86:8c:08:92:74:71:0e:ac:a6:7d:ba:1d:7c:d3:
b6:74:ef:27:7a:5e:53:21:fc:8e:eb:26:58:e0:6e:4f:5c:01:
f1:40:ca:0a:e9:d2:0e:00:60:ae:1f:f6:a5:a4:4c:47:fb:e0:
68:7f:25:63:ab:60:38:0f:74:94

Создание самоподписанного тестового сертификата

При использовании сертификатов в реальной инфраструктуре, они должны быть подписаны и проверены корневым центром сертификации (например, Verisign или Thawte). Однако подобные сертификаты довольно дороги и, к тому же, для их получения требуется потратить много времени. Для тестирования вполне достаточно «поддельного» или самоподписанного сертификата, в котором определяется публичный ключ, и он же используется для создания подписи. Для создания подобных сертификатов в OpenSSL предусмотрена подкоманда req, которая используется вместе с параметром -x509.

$ openssl req -x509 -newkey rsa:2048
Generating a 512 bit RSA private key
. ++++++++++++
. ++++++++++++
writing new private key to 'privkey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
.

Параметр –newkey заставляет OpenSSL сгенерировать секретный ключ, иначе вам придется ввести его самостоятельно.

Если вы не хотите выводить на экран содержимое сертификата, используйте параметр –out.

$ openssl req -x509 -newkey rsa:2048 -out selfsign.cer

По умолчанию секретный ключ записывается в файл privkey.pem (если уже существует файл с таким именем, то он перезаписывается без предупреждения!). Чтобы избежать возможных проблем, старайтесь определять самостоятельно файл для секретного ключа:

$ openssl req -x509 -newkey rsa:2048 -out selfsign.cer -keyout selfsign.key

$ openssl req -x509 -newkey rsa:2048 -out server.crt -keyout server.key

При этом вам будет предложено ввести некоторые параметры сертификата, но главное – в параметре Common Name следует указать «localhost».

Создание запроса для загрузки сертификата в центр сертификации


$ openssl req -newkey rsa:2048 -out selfsign.cer -keyout selfsign.key

Помните, когда я говорил о том, что могут возникнуть проблемы при перезаписи файла секретного ключа? Так вот, представьте себе ситуацию, когда CSR загружен в центр сертификации, а потом, нечаянно, перезаписан файл секретного ключа. Не забывайте, что секретный ключ не подлежит восстановлению (иначе инфраструктура, а которой базируется SSL, была бы уязвима). Если же ключ утерян, сгенерированный сертификат становится бесполезен (необходимо делать регулярные резервные копии подобных файлов).

Подписание запроса на создание сертификата

При помощи OpenSSL можно создать свой собственный центр сертификации и не прибегать к услугам коммерческих центров и тем самым сэкономить немного денег.

В документации утверждается, что средства по созданию своего собственного центра сертификации были разработаны лишь в демонстрационных целях. Их никогда не планировалось использовать для работы в боевых условиях. Выдержка из документации:

«Первоначальной цель утилиты ca - продемонстрировать на примере, как происходит подпись запроса в центре сертификации, и не предполагается ее использование в реальной жизни. Тем не менее, некоторые пользователи используют утилиту ca для подписи запросов»

Для нечастого использования – средства OpenSSL вполне подходят, однако если вы хотите создать что-то более масштабное, необходимо развернуть серьезную инфраструктуру по управлению сертификатами.

Во-первых, как было показано выше, необходимо создать самоподписанный корневой сертификат. После этого создайте конфигурационный файл. В OpenSSL есть пример файла openssl.cnf, который находится в соответствующей папке (название директории может изменяться от версии к версии). В большинстве случаев (и особенно при тестировании) можно использовать как раз этот файл без каких-либо изменений. Если же вы планируете более плотно поработать с сертификатами, следует поподробнее ознакомиться с содержимым файла конфигурации. В нем есть несколько полезных параметров, например, местонахождение серийных номеров и списка отозванных сертификатов (Certificate Revocation List). Я не будут рассказывать обо всех опциях (если по-честному, с некоторыми из них я не сильно знаком). В большинстве случаев вы можете воспользоваться настройками по умолчанию.

Однако некоторые записи из раздела [ CA_default ] ссылаются на директории и файлы, которые, в случае их отсутствия, могут привести к проблемам при развертывании центра сертификации, и вы должны создать все необходимые файлы и папки перед тем, как подписывать CSR. В составе OpenSSL идет простая утилита CA.pl, которая упрощает весь процесс (на самом деле просто создается структура директорий, на которые ссылается файл openssl.cnf). За создание папок отвечает следующая секция:

mkdir demoCA
mkdir demoCA/certs
mkdir demoCA/crl
mkdir demoCA/newcerts
mkdir demoCA/private
touch demoCA/index.txt
echo "01" | demoCA/crlnumber

Этого вполне достаточно, чтобы развернуть простейший центр сертификации. В любой момент, в файле openssl.cnf можно изменить имена файлов и директорий.

После создания рабочего файла конфигурации и валидного CSR, можно подписать запрос при помощи следующей команды:

openssl ca -config ca.cnf -in csr.pem -out certificate.pem

Подписанные сертификат можно отсылать отправителю без каких-либо ухищрений, поскольку за безопасность всей инфраструктуры отвечает секретный ключ.

Если вы посмотрите на содержимое сгенерированного сертификата, то увидите текстовое описание (в точности такое же, какое сгенерировала бы команда openssl x509 -noout –text). Этот раздел, включаемый по умолчанию, создает проблемы в некоторых системах. Чтобы текстовое описание не добавлялось, используйте параметр –notext или же просто удалите его вручную.

Рассмотрим еще раз весь алгоритм при развертывании центра сертификации:

Создаем конфигурационный файл. Его минимальное содержимое должно быть следующим:

Если вы намереваетесь использовать центр сертификации для серьезных целей, установите сильный пароль для защиты файла cakey.pem и выставьте соответствующие права доступа:

$ chmod 400 cakey.pem

Сам по себе сертификат (в данном случае cakey.pem) будет размещен в конечных пунктах, где будут утверждаться подписанные сертификаты (к примеру, веб сервера, которые сконфигурированы для запроса клиентских сертификатов).

  1. Создайте запрос на подписание сертификата
  2. $ openssl req -newkey rsa:2048 -out csr.pem -keyout privkey.pem
  3. Подпишите запрос. Перед этим вы, возможно, захотите обратить внимание на содержимое директории с сертификатами для того, чтобы понимать механику процесса подписания сертификата.
  4. $ ls
  5. ca.cnf certs index.txt serial
  6. cacert.pem cakey.pem

Команда для подписания запроса:

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Смотрим обновленное содержимое директории:

$ ls
ca.cnf certs index.txt.attr serial
cacert.pem index.txt.old serial.old
cakey.pem index.txt signed.pem

Были добавлены новые файлы: index.txt.attr, index.txt.old и serial.old

Также в директории certs появилась копия подписанного сертификат:

Этот файл идентичен файлу signed.pem.

Следует отметить на поле subject у подписанного сертификата:

$ openssl x509 -in signed.pem -noout -subject
subject= /CN=Joshua Davies

Оно не совпадает с тем же самым полем из запроса:

Причина в содержимом раздела [ policy ], который находится в конфигурационном файле. Там я указал, чтобы выводился только атрибут commonName. Если бы я заходил отобразить другие атрибуты, то указал бы их отдельно:

countryName = optional
stateOrProvinceName = optional

Важно отметить, что поле subject подписанного сертификата необязательно будет совпадать с полем subject у запроса. Идентичным является лишь публичный ключ.

В этой минимальной конфигурации нашего центра сертификации отсутствуют другие важные возможности. Например, я не добавил поддержку аннулирования сертификатов. В данном случае моей целью было продемонстрировать вам на наглядном примере, как происходит процесс подписи, а не показать стабильное рабочее решение готового центра сертификации.

Подписание сертификата с начальной прошлой датой

При работе с сертификатами я столкнулся с проблемой, связанной с часовыми поясами. По умолчанию при подписании сертификата используется часовой пояс сервера. Бывали случаи, когда сертификат, созданный в часовом поясе восточном побережья, не устанавливался на сервере, находящимся на западном. Конечно, проблема не столь критична, но слегка раздражает. В OpenSSL команда ca позволяет указать начальную дату задним числом:

$ openssl ca -in csr.pem -startdate 140529000000Z

Передача информации для поля subject через командную строку

Если у вас уже есть некоторый опыт по созданию тестовых сертификатов (или даже отправки запроса в центр сертификации), то, возможно, вы заметили, что немного раздражает постоянно указывать поля country, state, locality, и т. д. Вы можете передать эту информацию через командную строку при помощи следующего скрипта:

openssl req -subj /C=US/ST=Texas/L=Plano/O=2xoffice/OU=Architecture/CN=$1


Мануал

Взять к примеру OpenSSL.

Эта криптографическая библиотека с открытым исходным кодом, которая реализует протоколы Transport Layer Security (TLS) и Secure Sockets Layer (SSL), разработана для «защиты связи по компьютерным сетям от перехвата», но угадайте, что?

С самого начала она была пронизана ошибками.

Несмотря на то, что вы не можете ничего сделать с ошибками, которые еще предстоит идентифицировать, вы можете по крайней мере защитить свои системы от тех ошибок, которые уже исправлены и задокументированы.

Жаль, что официальный сайт OpenSSL предлагает только исходники для Linux.

Если вы хотите запустить его, вам нужен бинарник под Windows, и если вы не хотите его собирать самостоятельно, вы должны найти другой вариант.

В этой статье я покажу,как можно настроить OpenSSL в Windows, не имея дело при этом дела со сборкой из исходников.

Чтобы загрузить нужный, перейдите по ссылке:

Не дайте себя одурачить ни строкой Win32 в URL-адресе, ни навигацией, указывающей на казалось бы древнюю страницу загрузки еще с 2004 года.

Прокрутите страницу вниз до раздела «Download Win32 OpenSSL».

Теперь вам нужно выбрать правильный файл из этого списка.

Для каждой версии есть два основных типа: light и full.

Загрузите файл под названием «Win64 OpenSSL v1.1.0f» (или версию с более новой версией, как только она станет доступна), чтобы скачать фулл установщик.


Текущая версия на момент написания этой статьи (OpenSSL 1.1.0h) сильно отличается от предыдущих версий. Это совсем не одно и то же, поэтому обратите внимание на номера релизов!

Шаг 2. Запустите установщик

Мы рекомендуем установить OpenSSL вне вашей системной директории Windows.

Следуйте инструкциям по установке через GUI.

Шаг 3. Запустите бинарный файл OpenSSL

Чтобы начать работу с OpenSSL, вы можете просто щелкнуть по нему правой кнопкой мыши в проводнике Windows в месте его установки, например в моем случае:

Читайте также: