Создайте папку, где будут храниться сертификаты, чтобы они не терялись во время переезда/переустановки системы:
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
В результате появятся два файла:
rootCA.crt
- корневой сертификат, который нужно установить в браузер (или в систему).rootCA.key
- ключ шифрования корневого сертификата (его устанавливать никуда не нужно, он используется для подписи других сертификатов).Чтобы установить сертификат в браузер, откройте настройки, далее безопасность, управление сертификатами, вкладка "Центры сертификации":
Нажмите кнопку "Импорт" и выберите файл сертификата.
Чтобы установить сертификат в систему (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
В результате в папке появятся два новых файла:
mydomain.crt
- сертификат.mydomain.key
- ключ шифрования.Создаём конфиг:
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;
...
}
Поскольку один сертификат может содержать список из нескольких доменов, то один и тот же конфиг можно использовать для разных сайтов.