1.Создание корневого сертификата, которым будут подписываться сертификаты для web-сайтов
1 |
# openssl req -x509 -nodes -days 3650 -newkey rsa:4096 -keyout rootCA.key -out /etc/ssl/certs/root-ca.crt -subj '/C=UA/ST=Kievskaya/L=Kiev/O=IT/OU=IT-Department/CN=Root-CA' -sha256 |
1 2 3 |
.................................................................................................++ ............................................++ writing new private key to 'rootCA.key' |
Просмотр корневого сертификата
1 |
# openssl x509 -text -noout -in /etc/ssl/certs/root-ca.crt | less |
1 2 3 4 5 6 7 8 9 10 11 |
Certificate: Data: Version: 3 (0x2) Serial Number: 17210735429407170498 (0xeed8d0afc90b5fc2) Signature Algorithm: sha256WithRSAEncryption Issuer: C=UA, ST=Kievskaya, L=Kiev, O=IT, OU=IT-Department, CN=Root-CA Validity Not Before: Apr 11 08:29:46 2018 GMT Not After : Apr 8 08:29:46 2028 GMT Subject: C=UA, ST=Kievskaya, L=Kiev, O=IT, OU=IT-Department, CN=Root-CA …… |
Проверка md5-хеш суммы корневого сертификата и ключа
1 |
# openssl x509 -noout -modulus -in /etc/ssl/certs/root-ca.crt | openssl md5 |
1 |
(stdin)= 503d3517d3114f56ac28c67f98a1d363 |
1 |
# openssl rsa -noout -modulus -in rootCA.key | openssl md5 |
1 |
(stdin)= 503d3517d3114f56ac28c67f98a1d363 |
Создание CSR-Запроса для web-сайта domain.com
В качестве альтернативного имени используется поддомен www.domain.com и IP-адрес сервера 192.168.1.56
Важно, чтобы поле Subject Alternative Name также содержало и основной домен domain.com
Т.к. при наличии поля SAN, поле СN(Common Name) игнорируется. Соответственно значение, указанное в поле Common Name и не указанное в поле SAN, будет отвергаться браузером( с выводом уведомления, что сертификат не выдан на это имя)
2.Создание конфигурационного файла openssl, который будет использоваться при создании csr-запроса для web-сайта
1 |
# nano /root/openssl.cnf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
[req] default_bits = 2048 prompt = no default_md = sha256 req_extensions = v3_req distinguished_name = req_distinguished_name [ req_distinguished_name ] C=UA ST=Kharkov L=Kharkov O=IT OU=IT-Department emailAddress=myname@mydomain.com CN =domain.com [ v3_req ] basicConstraints = CA:FALSE keyUsage = digitalSignature, keyEncipherment subjectAltName = @alt_names [ alt_names ] DNS.1 = domain.com DNS.2= www.domain.com IP.1 = 192.168.1.56 |
3.Создание приватного ключа web-сайта
1 |
# openssl genrsa -out web.key 2048 |
1 2 3 4 |
Generating RSA private key, 2048 bit long modulus ..................................................................+++ ..........................................+++ e is 65537 (0x10001) |
4.Создание запроса на сертификат web-сайта
1 |
# openssl req -new -key web.key -out web.csr -config /root/openssl.cnf |
Просмотр CSR-запроса
1 |
# openssl req -text -noout -in web.csr |
1 2 3 4 5 6 7 8 9 10 11 12 |
Certificate Request: Data: Version: 0 (0x0) Subject: C=UA, ST=Kharkov, L=Kharkov, O=IT, OU=IT-Department/emailAddress=myname@mydomain.com, CN=domain.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) …… X509v3 Subject Alternative Name: DNS:domain.com, DNS:www.domain.com, IP Address:192.168.1.56 Signature Algorithm: sha256WithRSAEncryption …… |
5.Создание сертификата сайта и подписывание этого сертификата корневым сертификатом
1 |
# openssl x509 -req -days 730 -in web.csr -CA /etc/ssl/certs/root-ca.crt -CAkey rootCA.key -CAcreateserial -out web.crt -extfile /root/openssl.cnf -extensions v3_req |
1 2 3 |
Signature ok subject=/C=UA/ST=Kharkov/L=Kharkov/O=IT/OU=IT-Department/emailAddress=myname@mydomain.com/CN=domain.com Getting CA Private Key |
Просмотр сертификата WEB-сайта(проверяем наличие в сертификате поля Subject Alternative Name с корректными значениями)
1 |
# openssl x509 -text -noout -in web.crt | less |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Certificate: Data: Version: 3 (0x2) Serial Number: 17620322787903570168 (0xf487f63818b680f8) Signature Algorithm: sha256WithRSAEncryption Issuer: C=UA, ST=Kievskaya, L=Kiev, O=IT, OU=IT-Department, CN=Root-CA Validity Not Before: Apr 11 08:37:38 2018 GMT Not After : Apr 10 08:37:38 2020 GMT Subject: C=UA, ST=Kharkov, L=Kharkov, O=IT, OU=IT-Department/emailAddress=myname@mydomain.com, CN=domain.com Subject Public Key Info: … X509v3 Subject Alternative Name: DNS:domain.com, DNS:www.domain.com, IP Address:192.168.1.56 Signature Algorithm: sha256WithRSAEncryption … |
Проверка md5-хеш суммы сертификата, приватного ключа и запроса на сертификат для web-сайта
1 |
# openssl x509 -noout -modulus -in /etc/ssl/certs/web.crt | openssl md5 |
1 |
# openssl rsa -noout -modulus -in web.key | openssl md5 |
1 |
# openssl req -noout -modulus -in web.csr | openssl md5 |
Создание цепочки сертифкатов
1 |
# cat web.crt /etc/ssl/certs/root-ca.crt > web-fullchain.crt |
В конфигурационном файле виртуального хоста Nginx для web-сайта указываем
1 2 |
ssl_certificate <path_to_file>/web-fullchain.crt; ssl_certificate_key <path_to_file>/web.key; |
Импортирование корневого сертификата
Импортирование корневого сертификата в браузер
Например, Mozilla Firefox на Windows
Загружаем с сервера на локальный комп файл /etc/ssl/certs/root-ca.crt
1 |
Инструменты->Настройки->Приватность и защита->Сертификаты->Просмотр сертификатов->Импортировать-> Указываем загруженный с сервера файл root-ca.crt |
Импортирование корневого сертификата в Debian/Ubuntu
1 |
# mkdir /usr/share/ca-certificates/extra |
1 |
# cp /etc/ssl/certs/root-ca.crt /usr/share/ca-certificates/extra/ |
1 |
# dpkg-reconfigure ca-certificates |
1 |
# update-ca-certificates |
Для проверки с командной строки в Debian/Ubuntu
В Debian/Ubuntu в локальный hosts файл добавляем
1 |
# nano /etc/hosts |
1 |
192.168.1.56 domain.com www.domain.com |
После чего с помощью curl проверяем отсутствие проблем с сертификатом WEB-сайта
1 |
# curl https://domain.com |
1 |
# curl https://www.domain.com |
1 |
# curl https://192.168.1.56 |
Проверка сертификата через браузер
Валидность сертификата web-сайта можно проверить без импортирования корневого сертификата в систему запустив curl с опцией —cacert /path/to/root-cerificate
1 |
# curl --cacert /etc/ssl/certs/root-ca.crt https://www.domain.com |
Весь цикл создания сертификатов корневого и для сайта в одном скрипте
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#!/bin/bash DEST_DIR="/etc/ssl/certs" CUR_PWD=$(dirname $0) sslfunction () { openssl req -x509 -nodes -days 3650 -newkey rsa:4096 -keyout ${CUR_PWD}/rootCA.key -out ${DEST_DIR}/root-ca.crt -subj '/C=UA/ST=Kievskaya/L=Kiev/O=IT/OU=IT-Department/CN=Root-CA' -sha256 cat > ${CUR_PWD}/openssl.cnf << EOF [req] default_bits = 2048 prompt = no default_md = sha256 req_extensions = v3_req distinguished_name = req_distinguished_name [ req_distinguished_name ] C=UA ST=Kharkov L=Kharkov O=IT OU=IT-Department emailAddress=myname@mydomain.com CN =domain.com [ v3_req ] basicConstraints = CA:FALSE keyUsage = digitalSignature, keyEncipherment subjectAltName = @alt_names [ alt_names ] DNS.1 = domain.com DNS.2= www.domain.com IP.1 = 192.168.1.56 EOF openssl genrsa -out ${CUR_PWD}/web.key 2048 openssl req -new -key ${CUR_PWD}/web.key -out ${CUR_PWD}/web.csr -config ${CUR_PWD}/openssl.cnf openssl x509 -req -days 730 -in ${CUR_PWD}/web.csr -CA ${DEST_DIR}/root-ca.crt -CAkey ${CUR_PWD}/rootCA.key -CAcreateserial -out ${CUR_PWD}/web.crt -extfile ${CUR_PWD}/openssl.cnf -extensions v3_req } sslfunction cat ${CUR_PWD}/web.crt ${DEST_DIR}/root-ca.crt > ${CUR_PWD}/web-fullchain.crt |
Источник:
https://habrahabr.ru/post/192446
http://apetec.com/support/GenerateSAN-CSR.htm