Almost Over

Получаем бесплатный WoSign сертификат и настраиваем под NGINX

Получаем бесплатный WoSign сертификат и настраиваем под NGINX

Статья неактуальна / NET::ERR_CERT_AUTHORITY_INVALID

На данный момент (Апрель, 2017-ый год) Google Chrome (а в дальнейшем Mozilla и Apple) перестал доверять сгенерированным через WoSign серификатам.
Более того, центры сертификации StartCom (которые, как и WoSign, тоже можно получить бесплатно) были также занесены в чёрный список, о чём можно почитать здесь и тут.
Также, сканирование этого сайта через SSL Test при сертификате от WoSign сейчас выдаёт мне следующее предупреждение:

This server’s certificate is not trusted by modern browsers. Grade will be capped to T after 8th May 2017. MORE INFO »

Увы, кроме Let’s Encrypt бесплатных аналогов на данный момент нет, поэтому предоставляю статью — Установка и автопродление сертификата от Let’s Encrypt.


Предополагается, что $DOMAIN — это наш сайт (например, almostover.ru).

Регистрация на WoSign

Идём на login.wosign.com/reg.html и регистрируеся. Благо, на WoSign есть поддержка Английского языка, поэтому с начальной регистрацией проблем возникнуть не должно.

После активации через почтовый ящик, откроется страница с предложением о скачивании сертификата, через который вместо логина/пароля можно будет впоследствии логиниться на WoSign.
WoSign Account Activation
Тут по желанию: можно через сертификат, а можно через логин и пароль.

Если Вы решили входить на WoSign через сертификат, то:

  1. Качаем сертификат и сохраняем его локально в какое-нибудь укромное место.
  2. Устанавливаем этот сертификат в корневое хранилище сертификатов и при установке вводим тот же пароль, который указывали при регистрации.
  3. Далее, на странице login.wosign.com/login.html логигимся либо через только что установленный сертификат, либо через логин/пароль.

Заказ сертификата WoSign

Переходим на buy.wosign.com/free/?lan=en и заполняем необходимые поля.
Request WoSign certificate

  1. Основной домен с www вводить не нужно, он добавится автоматически при снятой голочки “No need to bind this domain name“.
  2. Дополнительные домены с www сами не добавятся при этом. Если таковые нужны — их нужно дописать.
  3. Максимально допустимое число доменов, на считая основного = 5. Больше — уже не бесплатно.

Далее жмём “Domain Control verification“ и подтверждаем право владения на домен удобыным для нас способом. Я выбрал валидацию домена через сайт, через html файл.
ВНИМАНИЕ! Если у вас Китай в запрещённых странах, то при верификации сайта его нужно временно убрать.

$ nano /etc/nginx/bad_countries
1
CN 0;
$ service nginx reload

Генерация RSA & CSR

После того, как мы заказали сетрификат и валидировали домен, сразу же появится запрос на генерицию CSR.
WoSign request/submit the CSR

Здесь есть 2 варианта:

  1. Сгенерировать CSR прямо на сайте WoSign.
  2. Вставить уже заранее сгенерированный CSR другим способом. В этом варианте также доступны инструкции для генерации CSR.

Я выбираю второй вариант, генирируя CSR самостоятельно. Обращаем внимание, что не нужно вводить никакой информации во время генерации CSR.

$ mkdir -p /etc/nginx/ssl/
$ cd /etc/nginx/ssl/

$ openssl req -out $DOMAIN.csr -new -newkey rsa:2048 -nodes -keyout $DOMAIN.key
$ nano $DOMAIN.csr

Копируем CSR, вставляем, нажимаем “Check CSR“.
Check WoSign CSR

Если всё в порядке, подтверждаем.

Проверяется CSR…
Генерируется сертификат…

И, наконец-таки, сертификат готов и его можно скачать.
WoSign certificate is issued

P.S. Файл валидации домена и CSR-файл нам больше не нужны, поэтому можно смело их удалить. Заодно вернём Китай обратно в запрет, если он у нас в нём был.

$ rm /var/www/vhosts/$DOMAIN/$DOMAIN.html /etc/nginx/ssl/$DOMAIN.csr
$ nano /etc/nginx/bad_countries
1
CN 1;
$ service nginx reload

Установка сертификата

Распаковываем сертификат для NGINX из только что скачанного архива и заливаем его на сервер в /etc/nginx/ssl/.
В итоге у нас должно быть 2 файла сертификата: 1 файл с расширением crt и 1 файл с расширением key.

Начало конфига Джинкса для нашего домена, расположенного по /etc/nginx/sites/$DOMAIN, в идеале должно выглядеть примерно так.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# Redirect all www to non-www
server {
if ($legal_ip){set $bad_country 0;}
if ($bad_country){return 444;}

listen *:80;
listen *:443 ssl http2;
#listen [::]:80 ipv6only=on;
#listen [::]:443 ssl http2 ipv6only=on;
server_name www.'$DOMAIN';

ssl_certificate /etc/nginx/ssl/'$DOMAIN'.crt;
ssl_certificate_key /etc/nginx/ssl/'$DOMAIN'.key;

return 301 $scheme://'$DOMAIN'$request_uri;
}

# Redirect all non-encrypted to encrypted
server {
if ($legal_ip){set $bad_country 0;}
if ($bad_country){return 444;}

server_name '$DOMAIN';
listen *:80;
#listen [::]:80;

return 301 https://$server_name$request_uri;
}

server {
limit_conn addr 100;
limit_conn perip 100;
limit_conn perserver 10000;

if ($legal_ip){set $bad_country 0;}
if ($bad_country){return 444;}

#listen *:80;
listen *:443 ssl http2;
#listen [::]:443 ssl http2;
server_name '$DOMAIN';

charset utf-8;

#keepalive_timeout 70;

# If SSL
ssl_certificate /etc/nginx/ssl/'$DOMAIN'.crt;
ssl_certificate_key /etc/nginx/ssl/'$DOMAIN'.key;
# include /etc/nginx/global/ssl.conf;