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

Как создать SSL сертификат самостоятельно

Пошаговая инструкция как создать самоподписной 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

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

Главная страница / Блог / Как создать SSL сертификат самостоятельно

Заявка на обслуживание


Представьтесь, пожалуйста, чтобы мы знали как к вам обращаться
Мы никогда и не кому не предоставляем ваш E-mail.
Выберете тариф

Заказать бесплатный аудит



Отправить вопрос в службу поддержки