Всем привет!
Сегодня краткий рассказ о том, как получить ныне заветный зеленый замочек в строке браузера абсолютно бесплатно. Как Вы уже наверное догадались из заголовка речь пойдет о LetsEncrypt.
Предистория
На одном из моих проектов уже был настроен https протокол с сертификатом от StartSSL, но в один прекрасный день после обновления моего браузера FF до последней версии при входе на свой сайт я получаю ошибку:
Сертификат узла был отозван. (Код ошибки: sec_error_revoked_certificate)
Вот и приехали, а я только их выпустил… Начал разбираться и вышло, что по новым политикам безопасности FF несколько удостоверяющих центров были исключены, вот пруф, а вот список исключенных корневых центров (цитата):
The code will use the following Subject Distinguished Names to identify the root certificates, so that the control will also apply to cross-certificates of these roots.
- CN=CA 沃通根证书, OU=null, O=WoSign CA Limited, C=CN
- CN=Certification Authority of WoSign, OU=null, O=WoSign CA Limited, C=CN
- CN=Certification Authority of WoSign G2, OU=null, O=WoSign CA Limited, C=CN
CN=CA WoSign ECC Root, OU=null, O=WoSign CA Limited, C=CN- CN=StartCom Certification Authority, OU=Secure Digital Certificate Signing, O=StartCom Ltd., C=IL
- CN=StartCom Certification Authority G2, OU=null, O=StartCom Ltd., C=IL
Решено было срочно переходить на LetsEncrypt, так как сам же FF это и советовал (узнал, почитав багтрекер).
Подготовка
Предполагаем, что у Вас есть доступ к консоли сервера Ubuntu, а так же у Вас установлен Nginx (не важно в связке с Apache или нет), и установлен git.
Установка Letsencrypt
Создаем в корне сервера директорию opt, переходим в неё, клонируем дистрибутив с репозитория:
1 2 3 |
cd /opt/ git clone https://github.com/letsencrypt/letsencrypt cd letsencrypt |
Останавливаем Nginx, если он у Вас работает на 443 порту, либо что-то иное если слушает порт — останавливаем.
1 |
service nginx stop |
Генерируем сертификаты для Ваших доменов, можно сгенерировать как один сертификат для всех, так и отдельно для каждого. Для примера команда, сгенерировавшая сертификат для этого блока выглядит так:
1 |
./letsencrypt-auto certonly --standalone --email admin@savenkoff.com -d savenkoff.com -d www.savenkoff.com |
Вы подменяете email адрес и указываете доменные имена через опция -d.
Если всё успешно — софт сгенерирует сертификаты и положит их в папку:
1 |
/etc/letsencrypt/live/[example.com] |
Но данный этап не прошел у меня гладко и при генерации появились ошибки:
1 2 3 4 5 6 7 8 9 |
------------------------------------------------------------------------------- Could not bind TCP port 443 because it is already in use by another process on this system (such as a web server). Please stop the program in question and then try again. ------------------------------------------------------------------------------- Press Enter to Continue An unexpected error occurred: TypeError: object of type 'NoneType' has no len() Please see the logfiles in /var/log/letsencrypt for more details. |
Получается, софт не смог открыть соединение на 443 порту, хотя nginx мы остановили. Начал разбираться, что держит порт:
1 2 |
root@vps:/opt/letsencrypt# netstat -nap | grep 443 tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 10568/nginx: worker |
Ага, есть повисший процесс nginx, избавляемся:
1 2 |
root@vps:/opt/letsencrypt# fuser -k 443/tcp 443/tcp: 10568 10569 10570 10571 |
Запускаем команду генерации сертификатов, в итоге должны получить следующее:
1 2 3 4 |
Waiting for verification... Cleaning up challenges Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem |
Отлично , сертификаты готовы!!! Что-бы удостовериться переходим в папку с доменом:
1 |
/etc/letsencrypt/live/[example.com] && ls -la |
Получаем описание находящихся там файлов:
1 2 3 4 5 6 7 8 |
total 12 drwxr-xr-x 2 root root 4096 Jan 28 17:47 . drwx------ 4 root root 4096 Jan 28 18:31 .. -rw-r--r-- 1 root root 543 Jan 28 17:47 README lrwxrwxrwx 1 root root 34 Jan 28 17:47 cert.pem -> ../../archive/[example.com]/cert1.pem lrwxrwxrwx 1 root root 35 Jan 28 17:47 chain.pem -> ../../archive/[example.com]/chain1.pem lrwxrwxrwx 1 root root 39 Jan 28 17:47 fullchain.pem -> ../../archive/[example.com]/fullchain1.pem lrwxrwxrwx 1 root root 37 Jan 28 17:47 privkey.pem -> ../../archive/[example.com]/privkey1.pem |
Для дальнейшей настройки сервера Nginx нам понадобятся 2 файла, это fullchain.pem
, и privkey.pem
.
Настройка Nginx
Идем в директорию с файлами настроек хостов:
1 |
cd /etc/nginx/sites-available |
При необходимости создать настройки для отдельного хоста — используем его конфигурационный файл, при отсутствии — файл default. При необходимости создать файл конфигурации можно воспользоваться служебными командами nginx, либо скопировать файл default в другой и произвести настройки в нём. Пример конфигурации nginx в связке с Apache для работы с https протоколом:
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 51 52 53 54 55 56 57 58 59 60 61 62 63 |
server { listen 80; server_name example.com www.example.com; # if ( $scheme = "http" ) { # rewrite ^/(.*)$ https://$host/$1 permanent; #301 redirect # } index index.php index.html index.htm; root /var/www/html; location / { proxy_pass http://127.0.0.1:8080; include proxy_params; } location @backend { proxy_pass http://127.0.0.1:8080; include proxy_params; } location ~* \.(html|htm|css|xml|rss|gif|jpeg|jpg|js|atom|mml|jad|wml|htc|png|tif|tiff|wbmp|ico|jng|bmp|jar|war|ear|hqx|doc|pdf|ps|eps|ai|rtf|xls|ppt|wmlc|xhtml|cco|jardiff|jnlp|run|pl|pm|prc|pdb|rar|sea|swf|sit|tcl|tk|der|pem|crt|xpi|zip|eot|iso|img|msi|msp|msm|mid|midi|kar|mp3|ra|3gpp|3gp|mpeg|mpg|mov|flv|mng|asx|asf|wmv|avi|rar|txt)$ { try_files $uri @backend; expires max; log_not_found off; } location ~ /\.ht { deny all; } } server { listen 443; server_name example.com www.example.com; ssl on; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; index index.php index.html index.htm; root /var/www/html; location / { proxy_pass http://127.0.0.1:8080; include proxy_params; } location @backend { proxy_pass http://127.0.0.1:8080; include proxy_params; } location ~* \.(html|htm|css|xml|rss|gif|jpeg|jpg|js|atom|mml|jad|wml|htc|png|tif|tiff|wbmp|ico|jng|bmp|jar|war|ear|hqx|doc|pdf|ps|eps|ai|rtf|xls|ppt|wmlc|xhtml|cco|jardiff|jnlp|run|pl|pm|prc|pdb|rar|sea|swf|sit|tcl|tk|der|pem|crt|xpi|zip|eot|iso|img|msi|msp|msm|mid|midi|kar|mp3|ra|3gpp|3gp|mpeg|mpg|mov|flv|mng|asx|asf|wmv|avi|rar|txt)$ { try_files $uri @backend; expires max; log_not_found off; } location ~ /\.ht { deny all; } } |
Особо стоит обратить внимание на:
1 — секция для выполнения 301 редиректа с протокола http на протокол https указанных доменов (# — знак комментирования строки, при необходимости убрать)
1 2 3 |
# if ( $scheme = "http" ) { # rewrite ^/(.*)$ https://$host/$1 permanent; #301 redirect # } |
2 — секция настроек, работающих только по https протоколу:
1 2 3 |
server { listen 443; } |
3 — добавление созданных сертификатов и включение шифрования:
1 2 3 |
ssl on; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; |
Основные моменты озвучил — остальные настройки опциональын. Запускаем nginx:
1 2 3 |
root@vps:/etc/nginx# service nginx start root@vps:/etc/nginx# service nginx status * nginx is running |
Вроде всё.