Самоподписанные сертификаты для разработки (openssl, https, nginx)

Перед началом работы

Создайте папку, где будут храниться сертификаты, чтобы они не терялись во время переезда/переустановки системы:

mkdir -p /var/www/cert
cd /var/www/cert

Последующие команды должны выполняться в папке, где будут храниться сертификаты.

Генерируем корневой сертификат

Выполните команду:

openssl req -x509 -new -newkey rsa:2048 -nodes -keyout rootCA.key -subj "/CN=localhost/O=localhost" -sha256 -days 7300 -out rootCA.crt

В результате появятся два файла:

Чтобы установить сертификат в браузер, откройте настройки, далее безопасность, управление сертификатами, вкладка "Центры сертификации":

Настройки сертификатов

Нажмите кнопку "Импорт" и выберите файл сертификата.

Чтобы установить сертификат в систему (Ubuntu), выполните:

sudo apt install -y ca-certificates
sudo cp rootCA.crt /usr/local/share/ca-certificates/myRootCA.crt
sudo update-ca-certificates

Генерируем сертификат для домена (или нескольких доменов)

Создаём переменную для названия домена:

MYDOMAIN=example.com

Создаём конфиг для openssl:

cat - <<EOF > ${MYDOMAIN:-mydomain}.openssl.conf
[ req ]
req_extensions         = extensions
x509_extensions        = extensions
string_mask            = utf8only

[ extensions ]
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints       = CA:FALSE
keyUsage               = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage       = serverAuth
subjectAltName         = @alternate_names
nsComment              = "OpenSSL Generated Certificate"

[ alternate_names ]

DNS.1                  = ${MYDOMAIN:-mydomain.td}
DNS.2                  = *.${MYDOMAIN:-mydomain.td}
EOF

В секции [ alternate_names ] указываются доменные имена, которые будут подтверждаться сертификатом. Можно указывать домены (example.com, localhost и т.д.) и маски (*.mydomain.td, *.*.mydomain.td). Но нельзя указывать маску для домена второго уровня (*.ru, *.local и т.д.).

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

echo "openssl req -config ${MYDOMAIN:-mydomain}.openssl.conf -new -x509 -newkey rsa:2048 -nodes -keyout ${MYDOMAIN:-mydomain}.key -CA rootCA.crt -CAkey rootCA.key -subj '/CN=c' -days 3650 -out ${MYDOMAIN:-mydomain}.crt" > update_${MYDOMAIN:-mydomain}.sh

Генерируем сертификат для домена:

bash update_${MYDOMAIN:-mydomain}.sh

В результате в папке появятся два новых файла:

Настройки NGINX

Создаём конфиг:

cat - <<EOF > ${MYDOMAIN:-mydomain}.nginx.conf
listen 443 ssl;
ssl_certificate     $PWD/${MYDOMAIN:-mydomain}.crt;
ssl_certificate_key $PWD/${MYDOMAIN:-mydomain}.key;
ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers         HIGH:!aNULL:!MD5;
EOF

В конфиге сайта подключаем настройки сертификата:

server {
  ...
  include /путь/до/mydomain.nginx.conf;
  ...
}

Поскольку один сертификат может содержать список из нескольких доменов, то один и тот же конфиг можно использовать для разных сайтов.

Хорошая статья, мне понравилась. Оставлю отзыв!