Блог о программировании на PHP, Yii2, 1C-Bitrix

Перенос проектов yii2, wordpress, bitrix на nginx + php-fpm с подключением ssl или «да это делается 15 минут». Часть 2

Шаг 2, получаем и устанавливаем сертификаты от startssl.

Ссылка на предыдущую статью: Перенос проектов yii2, wordpress, bitrix на nginx + php-fpm с подключением ssl или «да это делается 15 минут». Часть 1.

Регистрируемся в сервисе и ждем подтверждения аккаунта. У меня прошло около 3 дней до получения заветного письма. Для авторизации будет использоваться присланный в письме ключ, лучше его куда-нибудь сохранить, потому что я не подумав оставил все доступы на домашнем компьютере и перенос отложился на 2 дня :)

Авторизуемся здесь через выданный ключ. Подтверждаем владение доменом, подтверждение будет выслано на e-mail, если это зона .pro или .com то на указанный при регистрации, если .ru или другие, то на webmaster@domainname, поэтому предварительно создаем данный ящик.

domain

Дальше, подготавливаем запрос на получение сертификата в консольке:
openssl req -new -newkey rsa:4096 -nodes -keyout example.key -out example.csr

Внимание, здесь нужно указать длину ключа больше 1024, иначе будут проблемы с идентификацией в браузере.
Далее заполняем предлагаемую форму и все, ключ готов.

fields

Идем в панельку startssl и создаем запрос.

cert

Второй шаг пропускаем, т.к. мы сами сгенерировали ключ, на третьем шаге копируем в область ввода содержимое файла example.csr без дополнительных пробелов и прочих символов.
Переходим на следующий шаг, выбираем домен и поддомен для регистрации, ВНИМАНИЕ, я три раза тупил и выбирал не нужные поддомены, а потом при настройке nginx’a мне потребовалось сделать редирект с www на без www, и оказывается нужно было указать в виде поддомена www.

Далее, далее, далее, если все прошло успешно, то мы получим сертификат, сохраняем его в example.crt, так же сохраняем сертификаты для верификации startssl, sub.class1.server.ca.pem .
Если, по каким-либо причинам вы не сохранили выданный сертификат, то ничего страшного, они будут доступны в разделе Tool Box -> Retrieve Certificate.
Некоторые сертификаты должны пройти проверку администрацией, поэтому их получение будет возможно только через несколько часов после регистрирования.

Идем в консольку, объединяем выданные сертификаты и наш ключ в цепочку, первым должен идти наш ключ затем наш сертификат example.crt, затем intermediate, и в конце root certificate.

chain

cat example.key example.crt sub.class1.server.ca.pem ca.pem > example.com.chained.pem

Ложим получившуюся подпись в /etc/ssl и донастраиваем nginx на использование ssl.

Для начала доопределяем прослушку портов 443 в блоке server:

listen 443 ssl;
listen [::]:443 ssl; - для ipv6

Делаем редирект с 80 порта:

server {
    listen 80;
    listen [::]:80;
    
    server_name example.com;
    
    return 301 https://$server_name$request_uri;
}

Хотя для индексируемых сайтов не советую делать этого сразу, т.к. яндекс начинает беситься и выкидывать сайт из поиска, с остальными поисковиками все в порядке, яндекс такой яндекс.

Доопределяем ключи ниже в базовом блоке server,а:

keepalive_timeout 60;
ssl_certificate /etc/ssl/example.chained.pem;
ssl_certificate_key /etc/ssl/example.key;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "RC4:HIGH:!aNULL:!MD5:!kEDH";
add_header Strict-Transport-Security 'max-age=604800'

И перезагружаем nginx:

service nginx restart

И получаем красивую зелененьку иконочку слева от имени домена ^^.

У startssl есть свои ньюансы, он условно бесплатный, поэтому если хотите по-упражняться в подписывании сертификатов, то лучше выбирайте поддомены не www, иначе отзыв сертификата будет стоит 24$ и редирект с www на без www не получится сделать.

Второй особенностью является то, что необходимо каждые 30 дней валидировать e-mail, иначе сертификаты перестану действовать, но в принципе это нормальная цена за 7 бесплатных сертификатов xD.

Ну и кстати самый зловещий редирект с www на без www, с которым я возился дольше всего, не в плане конфигурации, а в плане того, что мне пришлось перевыпускать все сертификаты заново:

...
server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name www.domain.com;

    return 301 $scheme://$server_name$request_uri;
}
...

Все, перезагружаем nginx и хватит на этом.

Закончу пожалуй фразой о том, сколько у меня все это заняло времени, с учетом того, что я уже давно не разбирался с конфигами nginx’a и мне пришлось долго копаться в мануалах. Плюс у меня все таки 7 доменов и столько же проектов. Поэтому если не шарите в этом, оценивайте приблизительно это время.

И так… мне потребовалось… 15 часов… 15 ЧАСОВ КАРЛ!!!.