Бесплатный SSL сертификат от Let's Encrypt

Дано:

Задачи:


Работа:

    Создание SSL сертификата

  1. В корне сайта создаём директорию
    .well-known
    , с помощью которой произойдёт подтверждение прав на домен
  2. В nginx в конфиге сайта (/etc/nginx/sites_available), в блоке
    server { }
    откроем доступ для выше созданной директории:
    location ~ /.well-known
    {
      allow all;
      root /home/www/dim.st;
    }
    
  3. Проверим доступность выше созданной директории - создадим в ней файл "test.html" и откроем его в браузере:
    http://dim.st/.well-known/test.html
    Файл открывается - идём дальше
  4. Работаем от root в SSH консоли. Переходим в любую директорию системы, куда будем устанавливать официальный скрипт-установщик certbot-auto:
    cd /usr/local/sbin
  5. Скачиваем скрипт:
    wget https://dl.eff.org/certbot-auto
  6. Даём скрипту права на выполнение:
    chmod a+x certbot-auto
  7. Изменяем параметры на свои и запускаем скрипт:
    certbot-auto certonly -a webroot --webroot-path=/home/www/dim.st -d dim.st -d www.dim.st --email root@dim.st

    /home/www/dim.st
    - расположение файлов сайта

    dim.st
    и
    www.dim.st
    - домены, для которых создаются SSL сертификаты

    root@dim.st
    - контактный email админа сайта

  8. После успешного завершения работы скрипта появится директория "/etc/letsencrypt". В
    /etc/letsencrypt/live/dim.st
    лежат SSL сертификат и ключ.
  9. Генерируем Diffie–Hellman ключ:
    openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

  10. Настройка веб-сервера nginx

  11. Открываем конфиг сайта в nginx (/etc/nginx/sites_available) и приводим к следующему виду, изменяя сайт dim.st на свой:
    # конфигурация http запросов
    server
    {
      listen 80;
    
      server_name dim.st www.dim.st;
      
      # IPv6 (если нет необходимости - удалить)
      listen [::]:80;
      
      # перенаправление всех http запросов к https
      return 301 https://dim.st$request_uri;
    }
    
    # конфигурация https запросов
    server
    {
      listen 443 ssl;
    
      # IPv6 (если нет необходимости - удалить)
      listen [::]:443 ipv6only=on ssl;
    
      server_name dim.st www.dim.st;
    
      root /home/www/dim.st;
    
      charset utf-8;
    
      # пути до SSL сертификата и ключа
      ssl_certificate fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/dim.st/privkey.pem;
    
    
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      ssl_prefer_server_ciphers on;
    
      # Diffie–Hellman ключ
      ssl_dhparam /etc/ssl/certs/dhparam.pem;
    
      # этот параметр взять из /etc/letsencrypt/options-ssl-nginx.conf
      ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256 ECDHE-ECDSA-AES256-GCM-SHA384 ECDHE-ECDSA-AES128-SHA ECDHE-ECDSA-AES256-SHA ECDHE-ECDSA-AES128-SHA256 ECDHE-ECDSA-AES256-SHA384 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-AES128-SHA ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES256-SHA384 DHE-RSA-AES128-GCM-SHA256 DHE-RSA-AES256-GCM-SHA384 DHE-RSA-AES128-SHA DHE-RSA-AES256-SHA DHE-RSA-AES128-SHA256 DHE-RSA-AES256-SHA256 EDH-RSA-DES-CBC3-SHA";
    
      ssl_session_cache shared:le_nginx_SSL:1m;
      ssl_session_timeout 1440m;
      ssl_stapling on;
      ssl_stapling_verify on;
      add_header Strict-Transport-Security max-age=15768000;
    
      location ~ /.well-known
      {
        allow all;
      }
    
      # ниже идут ваши персональные настройки
    }
  12. Проверяем конфиг nginx на ошибки
    nginx -t
    . Если ошибок нет - перезагружаем nginx
    service nginx reload
  13. Проверяем, открыт ли порт 443 (https) в firewall
    iptables -L
    . Если нет, открываем его
    iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
  14. Тестируем сайт на доступность по https:
    • https://dim.st должен открываться
    • http://dim.st должен перенаправляться на https://dim.st
    • http://www.dim.st должен перенаправляться на https://www.dim.st

    Можно избавиться от www. В конфиге nginx:

    if ($host = 'www.dim.st' ) { rewrite  ^(.*)$  https://dim.st$1  permanent; }

  15. Автообновление SSL сертификата

  16. Открываем планеровщик задач cron
    crontab -e
    и вставлем в него:
    30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log
    35 2 * * 1 /etc/init.d/nginx reload

  17. Настройка node.js socket.io для работы с SSL

  18. Сервер:
    var fs = require('fs');
    var https = require('https');
    https.globalAgent.options.rejectUnauthorized = false; 
    
    var ssl = {
      key: fs.readFileSync('privkey.pem'),
      cert: fs.readFileSync('fullchain.pem')
    };
    
    var app = https.createServer(ssl);
    var io = require('socket.io').listen(app);
    app.listen(7000);

    privkey.pem
    и
    fullchain.pem
    - это SSL ключ и сертификат, которые выше создал скрипт certbot-auto. Они лежат в "/etc/letsencrypt/live/dim.st/" и права на них имеет root. Если ваше node.js приложение работает не от root, то эти файлы нужно скопировать куда-нибудь с нужными правами и указать корретный путь до них.

    Клиент:
    $.getScript("https://dim.st:7000/socket.io/socket.io.js",function()
      {
        var socket=io.connect('https://dim.st:7000',{secure: true});
      });

certbot-auto certonly -d dim.st -d www.dim.st -d xxx.dim.st -d qwe.dim.st