ssl сертификат для localhost

Для целей разработки на локальном хосте иногда нужно сделать ssl сертификат, да и еще чтобы браузер не ругался на него. Возникает такая необходимость, например, если приходится тестировать приложение, которое работает только по шифрованному каналу (к примеру jitsi application - у них это вообще требование).


Я буду показывать примеры кода, предполагая что у читателя этой заметки установлен nginx и работа идёт в linux, почитать про установку серверного окружения можно здесь. Будем подключать домен sandbox.loc. Пускай этот проект будет пока совершенно пустой или там будет файл index.html с приветствием.

Идея создания правильного самоподписанного сертификата заключается в том, что необходимо создать цепочку сертификатов ssl, да еще чтобы браузер знал о "вашем" центре сертификации. Поэтому затем ему надо созданный корневой сертификат импортировать во вкладку "Центры сертификации". Но и это еще не всё! Как оказывается, нужно задавать специальный параметр SAN (Subject Alternative Names) и на основании данной информации генерировать конечный сертификат с указанием этого параметра. В нём должен быть указан ваш локальный домен.

Я предпочитаю создавать специальный каталог для размещения всех сертификатов на локальные домены в папке ssl:

cd /etc/nginx
mkdir ssl
cd ssl
sudo openssl genrsa -des3 -out localRootCA.key 2048 # создать закрытый ключ корневого сертификата

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

sudo openssl req -x509 -new -nodes -key localRootCA.key -sha256 -days 1024 -out localRootCA.pem # корневой сертификат

Отвечаем на вопросы, которые задает программа, в основном все можно пропускать, кроме Common Name (e.g. server FQDN or YOUR name), тут укажите свой локальный домен (кстати, возможно не обязательно, не буду 100% утверждать, не проверял эту ситуацию). Теперь учитывая, что у нас есть корневой сертификат, создаем сертификат ssl. Но при создании X.509 v3 сертификата нужен SAN, поэтому создадим предварительно файл x509v3.ext:

sudo nano x509v3.ext

И поместим в него следующие данные:


authorityKeyIdentifier = keyid, issuer
basicConstraints = CA: FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = sandbox.loc  # SAN запись

Далее закрытый ключ и подпись:

sudo openssl req -new -nodes -out sandbox.csr -newkey rsa:2048 -keyout sandbox.key

Отвечаем на вопросы аналогично, но ставим локальный домен в параметр Common Name (e.g. server FQDN or YOUR name) (опять таки возможно не обязательно). Теперь "выдаем" сертификат с ранее созданным корневым:

sudo openssl x509 -req -in sandbox.csr -CA localRootCA.pem -CAkey localRootCA.key -CAcreateserial -out sandbox.crt -days 500 -sha256 -extfile x509v3.ext

Затем в хроме заходим Настройки - Сертификаты (или по ссылке chrome://settings/certificates), выбираем Центры сертификации - Импорт, выбираем localRootCA и ставим галочку доверять этому сертификату при идентификации сайтов.

Затем пишем новый минимальный конфиг для домена sandbox.loc nginx:

server {
    listen 80;
    server_name sandbox.loc;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;

    server_name sandbox.loc;
    root /var/www/sandbox.loc;
    index index.html index.php

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED";

    add_header Strict-Transport-Security "max-age=31536000";

    ssl_certificate /etc/nginx/ssl/sandbox.crt;
    ssl_certificate_key /etc/nginx/ssl/sandbox.key;

    location ~ \.php$ {
	include snippets/fastcgi-php.conf;
	fastcgi_pass unix:/run/php/php7.0-fpm.sock;
	fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
	fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
    }
}

Открываем браузер, радуемся:

sandbox https

Предупреждение браузер выдавать не будет. Отличный сертификат для локальной разработки.

sandbox detail localhost cert



Похожие заметки:

Веб-разработка

Займусь вашим проектом, если вам нужен специалист в области веб-разработки

Открыть здесь

279

Да здравствует Ябунта!

Да, настал момент! Попиарю немного вот этого хостера, ибо есть за что. Переустановил ОС на VDS, поставил новенькую Ubuntu-16.04 c nginx + php-fpm (про прирост производительности можно не говорить, это факт)

Открыть здесь

822

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

Услуги » Настройка веб-сервера

Регистрация, настройка с моей стороны VDS сервера в соответствии с выбраным вами тарифом

Открыть здесь

260


Перед тем как писать комментарии, рекомендую ознакомиться:

Markdown синтаксис »

Оформление кода »

Нужна аватарка »

Комментарии