Пошаговая инструкция как создать самоподписной 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) для вашего CA (центра сертификации), примерно следующего содержания:
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
Если решили заморочиться, то тогда команда создания сертификатов для CA будет вот такой:
openssl req -x509 -config ca.cnf -days 365 -newkey rsa:4096 -sha512 \
-keyout /etc/ssl/private/ca.key \
-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
На операционной системе MacOS надо просто добавить его в «Связку ключей» и обязательно указать как доверенный

Для linux (Ubuntu)
Тут надо для самой OS добавить в папку /usr/local/share/ca-certificates и запустить реконфигурацию:
sudo dpkg-reconfigure ca-certificates
После чего консольные клиенты будут воспринимать ваш центр сертификации как доверительный. Однако, Firefox и Chrome по-прежнему будут «ругаться», так как у них свои базы центров сертификации. И надо добавить для каждого браузера отдельно.
Для Firefox зайти в настройки > Приватность и защита > Просмотр сертификатов

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

И импортировать ваш ca.crt
Для Chrome все совершенно аналогично: Конфиденциальность и безопасность > Безопасность > Настроить сертификаты и импортировать сертификат.
Что может пойти не так. Для импорта сертификатов в linux используется библиотека libnss3-tools ее надо установить:
sudo apt install libnss3-tools
После чего все станет работать.
