ОСНОВЫ OPENSSL: SSL-СЕРТИФИКАТЫ, ЗАКРЫТЫЕ КЛЮЧИ И ЗАПРОСЫ НА ПОДПИСЬ
OpenSSL – это многофункциональный инструмент командной строки, предназначенный для управления инфраструктурой открытых ключей (PKI) и HTTPS.
Данное руководство предлагает вам краткий обзор команд OpenSSL, а также примеры использования и генерирования закрытых ключей, запросов на подпись сертификатов и изменения формата сертификата.
Запросы на подпись сертификатов (CSR)
Чтобы получить SSL-сертификат от центра сертификации (ЦС), нужно сначала создать запрос на подпись сертификата (CSR). CSR включает в себя открытый ключ и некоторые дополнительные данные. При подписи эти данные добавляются в сертификат.
Чтобы сгенерировать запрос на подпись сертификата, нужно предоставить данные о сертификате. В частности важно правильно заполнить поле Common Name (CN) в разделе Distinguised Name, в котором нужно указать FQDN хоста, для которого предназначается сертификат. Чтобы обойти интерактивные подсказки, можно передать все запрашиваемые данные через командную строку.
Другие поля в разделе Distinguised Name запрашивают данные об организации или компании. Если вы заказываете сертификат в ЦС, эти поля, как правило, нужно обязательно заполнить.
Запрос на подпись сертификата имеет такой вид:
---<br>Country Name (2 letter code) [AU]:US<br>State or Province Name (full name) [Some-State]:New York<br>Locality Name (eg, city) []:Brooklyn<br>Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company<br>Organizational Unit Name (eg, section) []:Technology Division<br>Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com<br>Email Address []:
Чтобы ответить на запросы CSR в неинтерактивном режиме, добавьте в команду опцию –subj, например:
-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"
Ознакомившись с запросами на подпись сертификата, вы можете перейти к любому другому разделу руководства.
Генерирование запроса на подпись сертификата
Генерирование закрытого ключа и запроса
Этот метод позволяет вам подписать сертификат в ЦС и защитить веб-сервер Apache или Nginx с помощью HTTPS. Сгенерированный запрос на подпись можно отправить в ЦС, чтобы получить подписанный сертификат. Если ЦС поддерживает SHA-2, добавьте опцию -sha256.
Следующая команда создаст 2048-битный закрытый ключ (domain.key) и CSR (domain.csr):
openssl req \<br>-newkey rsa:2048 -nodes -keyout domain.key \<br>-out domain.csr
Заполните поля в запросе на подпись.
Опция -newkey rsa:2048 создаст 2048-битный RSA-ключ. Опция –nodes отключает пароль для закрытого ключа.
Генерирование запроса для существующего закрытого ключа
Если у вас уже есть закрытый ключ, но нет сертификата, вы можете сгенерировать запрос для этого ключа.
Следующая команда создаст запрос сертификата (domain.csr) для существующего ключа (domain.key):
openssl req \<br>-key domain.key \<br>-new -out domain.csr
Ответьте на запросы программы, чтобы продолжить. Опция –new указывает, что запрос нужно сгенерировать.
Генерирование запроса для существующего сертификата и ключа
Этот метод позволяет обновить существующий сертификат, если оригинальный запрос на подпись сертификата был утерян.
Следующая команда создаст запрос (domain.csr) на основе существующего сертификата (domain.crt) и закрытого ключа (domain.key):
openssl x509 \<br>-in domain.crt \<br>-signkey domain.key \<br>-x509toreq -out domain.csr
Опция -x509toreq создаст сертификат X509.
Генерирование SSL-сертификата
Если вы хотите защитить свой сервис, но не хотите подписывать его в ЦС, вы можете создать и подписать сертификат самостоятельно.
Такие сертификаты называются самоподписанными.
По сути, самоподписанный сертификат – это сертификат, подписанный своим собственным закрытым ключом. Такие сертификаты тоже шифруют соединения, однако они не подтверждают подлинности сайта, потому пользователи, которые открывают сайт, увидят предупреждение.
Если вам ненужно подтверждать подлинность сайта, вы можете спокойно использовать самоподписанные сертификаты.
Генерирование самоподписанного сертификата
Этот метод позволяет защитить веб-сервер Apache или Nginx с помощью HTTPS.
Следующая команда создаст 2048-битный закрытый ключ (domain.key) и CSR (domain.csr):
openssl req \<br>-newkey rsa:2048 -nodes -keyout domain.key \<br>-x509 -days 365 -out domain.crt
Заполните запрос на подпись.
Опция -x509 создаёт самоподписанный сертификат. Опция -days 365 задаёт срок действия сертификата в днях.
Создание сертификата для существующего закрытого ключа
Если у вас уже есть закрытый ключ, но нет сертификата, вы можете сгенерировать сертификат для этого ключа.
Следующая команда создаст сертификат (domain.csr) для существующего ключа (domain.key):
openssl req \<br>-key domain.key \<br>-new \<br>-x509 -days 365 -out domain.crt
Ответьте на запросы программы, чтобы продолжить.
- Опция -x509 создаёт самоподписанный сертификат. Опция -days 365 задаёт срок действия сертификата в днях.
- Опция –new запускает запрос данных для создания CSR.
Генерирование запроса для существующего сертификата и ключа
Этот метод позволяет создать сертификат, если у вас уже есть закрытый ключ и запрос на подпись сертификата.
Следующая команда создаст сертификат (domain.crt) на основе существующего запроса (domain.csr) и закрытого ключа (domain.key):
openssl x509 \<br>-signkey domain.key \<br>-in domain.csr \<br>-req -days 365 -out domain.crt
Опция -days 365 задаёт срок действия сертификата в днях.
Просмотр сертификатов
Файлы сертификатов и запросов на подпись закодированы в формате PEM, который не может быть прочитан человеком.
Данный раздел научит вас читать такие файлы с помощью ряда команд.
Просмотр CSR
Эта команда позволяет просмотреть содержимое файла запроса на подпись сертификата в виде простого текста:
openssl req -text -noout -verify -in domain.csr
Просмотр сертификата
Следующая команда позволяет просмотреть содержимое сертификата в виде простого текста:
openssl x509 -text -noout -in domain.crt
Проверка подписи сертификата
Чтобы убедиться, что сертификат был подписан в ЦС, введите:
openssl verify -verbose -CAFile ca.crt domain.crt
Закрытые ключи
Создание закрытого ключа
Чтобы создать закрытый 2048-битный ключ, защищённый паролем, введите:
openssl genrsa -des3 -out domain.key 2048
По запросу введите пароль, чтобы продолжить.
Проверка закрытого ключа
Эта команда подтвердит валидность закрытого ключа:
openssl rsa -check -in domain.key
Если ключ зашифрован, программа запросит парольную фразу. Предоставьте пароль от ключа, чтобы просмотреть его в незашифрованном формате.
Совпадение ключа с сертификатом и запросом
Эта команда позволяет узнать, относится ли закрытый ключ (domain.key) к тому или иному сертификату (domain.crt) и запросу (domain.csr):
openssl rsa -noout -modulus -in domain.key | openssl md5<br>openssl x509 -noout -modulus -in domain.crt | openssl md5<br>openssl req -noout -modulus -in domain.csr | openssl md5
Если команды вернули одинаковый вывод, то, скорее всего, этот ключ, запрос и сертификат связаны.
Шифрование закрытого ключа
Следующая команда возьмёт незашифрованный ключ (unencrypted.key) и зашифрует его (encrypted.key):
openssl rsa -des3 \<br>-in unencrypted.key \<br>-out encrypted.key
Введите пароль, чтобы зашифровать ключ.
Дешифровка закрытого ключа
Эта команда может расшифровать зашифрованный ключ:
openssl rsa \<br>-in encrypted.key \<br>-out decrypted.key<br>Enter the pass phrase for the encrypted
Введите пароль, чтобы расшифровать ключ.
Форматы сертификатов
До этого в руководстве рассматривались только сертификаты X.509 с кодированием ASCII PEM. Однако существует множество других форматов. Некоторые форматы позволяют объединить компоненты – ключ, запрос, сертификат – в один файл.
Конвертация PEM в DER
Чтобы конвертировать PEM в DER, используйте такую команду:
openssl x509 \<br>-in domain.crt \<br>-outform der -out domain.der
Формат DER обычно использует Java.
Конвертация DER в PEM
Для этого введите:
openssl x509 \<br>-inform der -in domain.der \<br>-out domain.crt
Конвертация PEM в PKCS7
Чтобы добавить сертификаты PEM (domain.crt и ca-chain.crt) в файл PKCS7 (domain.p7b), введите:
openssl crl2pkcs7 -nocrl \<br>-certfile domain.crt \<br>-certfile ca-chain.crt \<br>-out domain.p7b
Файлы PKCS7 (также известные как P7B) часто используются в Java Keystores и Microsoft IIS (Windows).
Конвертация to PKCS7 в PEM
Чтобы конвертировать PKCS7 в PEM, введите:
openssl pkcs7 \<br>-in domain.p7b \<br>-print_certs -out domain.crt
Обратите внимание: файл PKCS7 содержит много компонентов, а именно сертификат и промежуточный сертификат ЦС.
Конвертация PEM в PKCS12
Следующая команда позволяет объединить закрытый ключ и сертификат в файл PKCS12.
openssl pkcs12 \<br>-inkey domain.key \<br>-in domain.crt \<br>-export -out domain.pfx
Программа запросит пароль. Файл PKCS12 позволяет объединить несколько сертификатов в один PEM-файл (domain.crt).
Файлы PKCS12 (или PFX) обычно используются для перемещения наборов сертификатов в Micrsoft IIS (Windows).
Конвертация PKCS12 в PEM
Чтобы конвертировать файл PKCS12 в формат PEM, введите:
openssl pkcs12 \<br>-in domain.pfx \<br>-nodes -out domain.combined.crt
Если в файле PKCS12 было несколько объектов (например, ключ и сертификат), все они переместятся в файл PEM.
Версии OpenSSL
Чтобы проверить версию OpenSSL, используйте команду openssl version.
Следующая команда выведет версию OpenSSL и все параметры, с которыми она была скомпилирована.
openssl version -a
В данном руководстве используется бинарный файл OpenSSL со следующими подробностями:
OpenSSL 1.0.1f 6 Jan 2014<br>built on: Mon Apr 7 21:22:23 UTC 2014<br>platform: debian-amd64<br>options: bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx)<br>compiler: cc -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM<br>OPENSSLDIR: "/usr/lib/ssl"
Теперь вы знакомы с основными методами и командами OpenSSL.