В статье будет рассмотрено несколько простых моментов связанных с работой SSL/OpenSSL, а именно: генерация сертификатов, просмотр действия сертификата и прочее.
1) Генерация клиентских сертификатов.
#openssl req -new -newkey rsa:1024 -nodes -keyout CERT_NAME.key -subj /C=US/ST=ALASKA/L='Department'/O='Company Inc.'/OU=IT/CN=CERT_NAME/emailAddress=EMAIL -out CERT_NAME.csr
#openssl ca -config CERT_PATH/ca.config -in CERT_NAME.csr -out CERT_NAME.crt -batch
и вдобавок создание p12 сертификата (например, для Windows-клиентов)
#openssl pkcs12 -export -in CERT_NAME.crt -inkey CERT_NAME.key -certfile CERT_PATH/ca.crt -out CERT_NAME.p12 -passout pass:CERT_PASS
где CERT_NAME-имя сертификата без суффиксов, CERT_PATH – путь, где будут сохранены сертификаты (и где лежит корневой ca.crt), EMAIL – email клиента
Если нужно сгенерировать p12-сертификат, но включить туда промежуточные сертификаты сервера, то делаем так:
#openssl pkcs12 -export -chain -in ./domain.com.crt -inkey ./domain.com.key -certfile ./trusted-chain.crt -out adobe.p12
где domain.com.crt, domain.com.key соответственно сертификат и ключ непосредственно домена, trusted-chain.crt все сертификаты промежуточных центров сертификации.
2) Просмотр срока действий сертификата
# openssl verify -CAfile ./ca.crt CERT_NAME.crt
CERT_NAME.crt: OK
Как видим, с сертификатом всё впорядке, а вот со следующим – нет (истёк срок действия):
# openssl verify -CAfile ./ca.crt CERT_NAME2.crt
CERT_NAME2.crt: C = US, ST = ALASKA, L = Department, O = Company Inc., OU = IT, CN = user.domain.com, emailAddress = user@domain.com
error 10 at 0 depth lookup:certificate has expired
OK
Можно получить расширенную информацию (в зависимости от того, какой типа сертификата вы хотите проверить, используйте соответствующую команду):
# openssl x509 -noout -text -in CERT_NAME.crt
# openssl rsa -check -in CERT_NAME.key
# openssl req -text -noout -verify -in CERT_NAME.csr
# openssl pkcs12 -info -in CERT_NAME.p12
3) renew(продление) crl сертификата
# openssl ca -gencrl -config ./ca.config -crldays 500 -out ./ca_new.crl
где путь к приватному сертификату берётся из конфига ./ca.config
- продление корневого сертификата:
# openssl x509 -in ca.crt -days 3650 -out ca_new.crt -signkey ca.key
4) генерация wildcard-сертификата.
Сгенерируем пару ключ и сертификат csr:
# openssl req -new -newkey rsa:2048 -nodes -keyout domain_com_wildcard.key -out domain_com_wildcard.csr
При этом будут задаваться вопросы, когда спросит FQDN-сайта (домена), нужно ввести *.domain.com (именно со звёздочкой). А теперь собственно сам сертификат:
# openssl ca -config ca.config -in domain_com_wildcard.csr -out STAR_domain_com_wildcard.crt
Если получите сообщение, что файл ca.key не найден – перейдите в ту папку, где он лежит.
Собственно пара domain_com_wildcard.key и STAR_domain_com_wildcard.crt являются ключём и сертификатом, которые нужно указать в вашем web-сервере.
5) Отзыв сертификата.
Собственно отзыв:
# openssl ca -config ./ca.config -keyfile ca.key -cert ca.crt -revoke CERT_NAME.crt
Проверка, что отозвался (буква R вначале)
# grep CERT_NAME db/index.txt
R 141002153915Z 140123163840Z A8 unknown /C=AA/ST=AA/L=AA/O=AA/OU=IT/CN=CERT_NAME/emailAddress=CERT_NAME@domain.com
Перегерация CRL:
# openssl ca -config ./ca.config -keyfile ca.key -cert ca.crt -gencrl -out ca.crl
6) Полезные ссылки
- Вот скрипты генерации сертификатов с различными условиями http://dadv.livejournal.com/201745.html
- Создание цепочки https://debian.pro/2138
- Структура SSL-сертификата https://habr.com/ru/company/plesk/blog/507094/
7) Проверка пары *.crt *.key
Ошибка вида (apache):
[error] Unable to configure RSA server private key
[error] SSL Library Error: 185073780 error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch
означает, что *.key и *.crt от разных пар ключей. Что бы это проверить, выполним 2 команды и, если результаты MD5 суммы разные – значит это не одна пара.
$ openssl x509 -noout -modulus -in your_domain_com.crt | openssl md5
$ openssl rsa -noout -modulus -in your_domain_com.key | openssl md5
$ openssl req -noout -modulus -in your_domain_com.csr | openssl md5
8 ) Конвертация.
p12 (pcf) -> pem (один файл)
$ openssl pkcs12 -in skeletor.p12 -out skeletor.pem -nodes
p12 (pcf, pfx) -> pem (separate crt, key)
$ openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys
$ openssl pkcs12 -in path.p12 -out newfile.key.pem -nocerts -nodes
DER (.crt .cer .der) -> PEM
$ openssl x509 -inform der -in MYCERT.cer -out MYCERT.pem
PEM -> DER (.crt .cer .der)
$ openssl x509 -outform der -in MYCERT.pem -out MYCERT.der
9) Генерация мульдоменного csr:
$ openssl req -new -key endpoint.com.key -sha256 -nodes
-subj '
/C
=US
/ST
=New York
/L
=New York
/O
=End Point
/OU
=Hosting Team
/CN
=www.endpoint.com/
emailAddress=administrative-not-existent-address@our-awesome-domain.com/
subjectAltName=DNS.1=endpoint.com,
DNS.2=usually-not-convered-domain.endpoint.com,
DNS.3=multiple-domains-crt.endpoint.com' > www.endpoint.com.csr
Один коментар до “Работаем с ssl”
Спасибо за статью. Правда, еще можно немного добавить команд по генерации csr,key и crt в разных ситуациях (на лету без вопросом, с готовым ключом, с ключом без пароля, и тп.), как пишут здесь – http://sysadm.pp.ua/internet/pound-apache-nginx-ssl-setup.html