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