28 Мая


2017

SSL сертификат от Let's Encrypt

В продолжении темы развертывания Django на боевом сервере. Собственно истек пробный период sll, и я вновь попробовал заюзать сертификаты от Let's Encrypt. Однако на этот раз из-за криворукости я забил на Certbot. Возможно виной всему не только мои кривые рученки.... как не крути, устанавливал я все вручную.

Для начала коннектимся по ssh на сервер (вся инструкция будет именно для vps/vds/дедика). Топаем в домашнюю директорию (ну или там где можно подгадить проектом с гита) и клонируем репозиторий:

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

Теперь запустим установку

./letsencrypt-auto --agree-dev-preview --server \https://acme-v01.api.letsencrypt.org/directory -a manual auth

Ключ -a manual необходим для ручной установки ключей, т.е. без автоматического изменения конфигов веб сервера (в моем случае nginx)

Команда выплюнет примерно следующее (все значения изменены):

mkdir -p /tmp/certbot/public_html/.well-known/acme-challenge
cd /tmp/certbot/public_html
printf "%s"  
_f223u4hdhf97sdf7932423i0da0sda.asdas8d03u4h30dasdh90hhdSH0du0a9wjpasdjsa_maksdmksUSasd > 
.well-known/acme-challenge/_fasdadasdgsdfgjJFJSdfsaldkapseduwhasmdaldda
# run only once per server:
$(command -v python2 || command -v python2.7 || command -v python2.6) -c \
"import BaseHTTPServer, SimpleHTTPServer; \
s = BaseHTTPServer.HTTPServer(('', 80), SimpleHTTPServer.SimpleHTTPRequestHandler); \
s.serve_forever()" 

Просто следуем инструкциям, создаем папку, переходим в нее, запускаем нужную версию интерпритатора питон и прописыаем указанную команду. Важно! Не забыть отрубить все, что может препятствовать верификации на 80 порту, в моем случае это был Nginx.

После завершения процедур в папке /etc/letsencrypt/live/[имя домена] появится 4 файла:

privkey.pem — приватный ключ для сертификата
Используется Apache для SSLCertificateKeyFile и nginx для ssl_certificate_key.

cert.pem (сертификат сервера)
Используется Apache для SSLCertificateFile.

chain.pem (сертификат цепочки)
Он же используется Apache для SSLCertificateChainFile.

fullchain.pem (соединение chain.pem и cert.pem)
Он же используется nginx для ssl_certificate.

Скормим теперь все это в nginx

Топаем сюды [nano /etc/nginx/sites-enabled/имя_конфига]

Настроим NGINX
server {
    listen 443 ssl;
    server_name 11.11.1.1;

    access_log /var/log/nginx/test.access.log;
    error_log /var/log/nginx/test.error.log;
   #root /home/<NAME>/html;

    gzip on;
    gzip_disable "msie6";
    gzip_types text/plain application/xml application/x-javascript text/javascr$

    ssl on;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets on;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    add_header Strict-Transport-Security max-age=15768000;
    ssl_certificate /etc/letsencrypt/live/[имя_домена]/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/[имя_домена]/privkey.pem;

    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8;

    location /collect_static/ {
        root /home/<NAME>/<DIR_NAME>/;
        expires 30d;
    }
    location /media {
        root /home/<NAME>/<DIR_NAME>/;
        expires 30d;
    }
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
          }
    location /media {
        root /home/<NAME>/<DIR_NAME>/;
        expires 30d;
    }
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
 }

server {
    listen 80;

    server_name 52.39.7.6;
    access_log  /var/log/nginx/example.log;
     }
 }

server {
    listen 80;

    server_name 52.39.7.6;
    access_log  /var/log/nginx/example.log;

    location /collect_static/ {
        root /home/<NAME>/<DIR_NAME>/;
        expires 30d;
    }
    location /media {
        root /home/<NAME>/<DIR_NAME>/;
        expires 30d;
    }
    location / {
        proxy_pass http://127.0.0.1:8000;
        root /home/<NAME>/<DIR_NAME>/;
        expires 30d;
    }
    location /media {
        root /home/<NAME>/<DIR_NAME>/;
        expires 30d;
    }
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

  }

На этом пожалуй по SSL все, через пару тройку месяц допишу как продлить сертификат (и напишу автоапдейт на баше для этих целей). Информацию черпал с просторов интернета, а также с хабра в частности. Certbot потещу также чуть позже на FirstVDS.

devops
Nginx
AWS
web