Установка Letsencrypt на Ubuntu 14.04 и nginx

Установка Letsencrypt на Ubuntu 14.04 и nginx

Всем привет!

Сегодня краткий рассказ о том, как получить ныне заветный зеленый замочек в строке браузера абсолютно бесплатно. Как Вы уже наверное догадались из заголовка речь пойдет о 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=CNCN=Certification Authority of WoSign, OU=null, O=WoSign CA Limited, C=CNCN=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=CNCN=StartCom Certification Authority, OU=Secure Digital Certificate Signing, O=StartCom Ltd., C=ILCN=StartCom Certification Authority G2, OU=null, O=StartCom Ltd., C=IL

Решено было срочно переходить на LetsEncrypt, так как сам же FF это и советовал (узнал, почитав багтрекер).

Подготовка

Предполагаем, что у Вас есть доступ к консоли сервера Ubuntu, а так же у Вас установлен Nginx (не важно в связке с Apache или нет), и установлен git.

Установка Letsencrypt

Создаем в корне сервера директорию opt, переходим в неё, клонируем дистрибутив с репозитория:

cd /opt/
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt

Останавливаем Nginx, если он у Вас работает на 443 порту, либо что-то иное если слушает порт — останавливаем.

service nginx stop

Генерируем сертификаты для Ваших доменов, можно сгенерировать как один сертификат для всех, так и отдельно для каждого. Для примера команда, сгенерировавшая сертификат для этого блока выглядит так:

./letsencrypt-auto certonly --standalone --email admin@savenkoff.com -d savenkoff.com -d www.savenkoff.com

Вы подменяете email адрес и указываете доменные имена через опция -d.

Если всё успешно — софт сгенерирует сертификаты и положит их в папку /etc/letsencrypt/live/[example.com]. Но данный этап не прошел у меня гладко и при генерации появились ошибки:

-------------------------------------------------------------------------------
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 мы остановили. Начал разбираться, что держит порт:

netstat -nap | grep 443
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      10568/nginx: worker

Ага, есть повисший процесс nginx, избавляемся:

fuser -k 443/tcp
443/tcp:             10568 10569 10570 10571

Запускаем команду генерации сертификатов, в итоге должны получить следующее:

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

Отлично, сертификаты готовы!!! Что-бы удостовериться переходим в папку с доменом:

/etc/letsencrypt/live/[example.com] && ls -la

Получаем описание находящихся там файлов:

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

Идем в директорию с файлами настроек хостов:

cd /etc/nginx/sites-available

При необходимости создать настройки для отдельного хоста — используем его конфигурационный файл, при отсутствии — файл default. При необходимости создать файл конфигурации можно воспользоваться служебными командами nginx, либо скопировать файл default в другой и произвести настройки в нём. Пример конфигурации nginx в связке с Apache для работы с https протоколом:

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 указанных доменов (# — знак комментирования строки, при необходимости убрать)
#       if ( $scheme = "http" ) {
#               rewrite ^/(.*)$ https://$host/$1 permanent; #301 redirect
#       }
  1. секция настроек, работающих только по https протоколу:
server {
        listen 443;
}
  1. добавление созданных сертификатов и включение шифрования:
        ssl     on;
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

Основные моменты озвучил — остальные настройки опционально. Запускаем nginx:

root@vps:/etc/nginx# service nginx start
root@vps:/etc/nginx# service nginx status
 * nginx is running

Вроде всё.