Photo by Lewis Keegan
Самоподписной сертификат

Создать самоподписной SSL сертификат

17.03.23
16.10.23

Часто для целей работы над созданием сайта на локальном компьютере или сервере нужен доступ к сайту через https. Для этих целей вам необходимо создать самоподписной SSL сертификат.

Процесс подойдет для Mac OS (и для Linux серверов)

Certificate Authority

Для начала создадим корневой сертификат, т.е. сертификат для самого центра сертификации. Есть два вариант, первый простой:

openssl req -x509 -nodes -new -sha512 -days 365 -newkey rsa:4096 \
-keyout /etc/ssl/private/ca.key \
-out /etc/ssl/certs/ca.pem \
-subj "/C=RU/CN=MYHOME-CA"

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

HOME            = .
RANDFILE        = $ENV::HOME/.rnd

####
[ ca ]
default_ca    = CA_default      # The default ca section

[ CA_default ]

default_days     = 365          # How long to certify for
default_crl_days = 30           # How long before next CRL
default_md       = sha512       # Use public key default MD
preserve         = no           # Keep passed DN ordering

x509_extensions = ca_extensions # The extensions to add to the cert

email_in_dn     = no            # Don't concat the email in the DN
copy_extensions = copy          # Required to copy SANs from CSR to cert

###
[ req ]
default_bits       = 4096
default_keyfile    = ca.pem
distinguished_name = ca_name
x509_extensions    = ca_extensions
string_mask        = utf8only

### distinguished_name ###
[ ca_name ]
countryName         = Country Name (2 letter code)
countryName_default = RU

stateOrProvinceName         = State or Province Name (full name)
stateOrProvinceName_default = Moscow

localityName                = Locality Name (eg, city)
localityName_default        = Baltimore

organizationName            = Organization Name (eg, company)
organizationName_default    = Test CA, Limited

organizationalUnitName         = Organizational Unit (eg, division)
organizationalUnitName_default = Server Research Department

commonName         = Common Name (e.g. server FQDN or YOUR name)
commonName_default = Test CA

emailAddress         = Email Address
emailAddress_default = test@example.com

####################################################################
[ ca_extensions ]

subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always, issuer
basicConstraints       = critical, CA:true
keyUsage               = keyCertSign, cRLSign

Тогда команда будет вот такой:

openssl req -x509 -config ca.cnf -days 365 -newkey rsa:4096 -sha512 \
 -nodes -out /etc/ssl/certs/ca.pem -outform PEM

Проверить сертификат можно так:

openssl x509 -in /etc/ssl/certs/ca.pem -text -noout

Далее, надо сделать crt-сертификат, который потом будем импортировать

openssl x509 -outform pem -in /etc/ssl/certs/ca.pem \
-out /etc/ssl/certs/ca.crt

Проверить можно так:

openssl x509 -text -in /etc/ssl/certs/ca.crt

Создаём закрытый ключ для домена и запрос на выпуск сертификата для него:

openssl req -new -nodes -newkey rsa:4096 \
-keyout /etc/ssl/private/localhost.key \
-out /etc/ssl/certs/localhost.csr \
-subj "/C=RU/ST=State/L=Moscow/O=Organization-Name/CN=localhost"

Далее, надо создать файл /etc/ssl/v3.ext следующего содержания:

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = mylocal.dev
DNS.2 = test-site.dev

Можно добавить необходимое количество доменных имён DNS.3, DNS.4 и так далее.

И наконец, создаём сам сертификат:

openssl x509 -req -sha512 -days 365 -extfile /etc/ssl/v3.ext \
-CA /etc/ssl/certs/ca.crt -CAkey /etc/ssl/private/ca.key \
-CAcreateserial -in /etc/ssl/certs/localhost.csr \
-out /etc/ssl/certs/localhost.crt

Не создавайте сертификат длительностью более 365 дней. Не получиться его сделать доверительным.
Что дальше.
Первое, добавляем следующие три строчки в файл настройки Apache (обычно /etc/apache/site-available/your-site.conf)

SSLEngine on
SSLCertificateFile /etc/ssl/certs/localhost.crt
SSLCertificateKeyFile /etc/ssl/private/localhost.key

Сделать самоподписной сертификат доверительным

И наконец, надо добавить корневой сертификат (/etc/ssl/certs/ca.crt) в вашу систему. Для Mac OS надо просто добавить его в «Связку ключей» и обязательно указать как доверенный

самоподписной  сертификат SSL

Для linux (Ubuntu)

Тут надо для самой OS добавить в папку /usr/local/share/ca-certificates и запустить реконфигурацию:

sudo dpkg-reconfigure ca-certificates

После чего консольные клиенты будут воспринимать ваш центр сертификации как доверительный. Но Firefox и Chrome по-прежнему будут «ругаться», так как у них свои базы центров сертификации. И надо добавить для каждого браузера отдельно.

Для Firefox зайти в настройки > Приватность и защита > Просмотр сертификатов

Далее, во вкладке «Центры сертификации» нажать кнопку «Импортировать»

И импортировать ваш ca.crt

Что может пойти не так. Для импорта сертификатов в linux используется библиотека libnss3-tools ее надо установить:

sudo apt install libnss3-tools

После чего все станет работать.

Для Chrome все совершенно аналогично: Конфиденциальность и безопасность > Безопасность > Настроить сертификаты и импортировать сертификат.