Подготовка сайта

Папка ".well-known" необходима для подтверждения прав владения доменом, для которого будет выдан SSL сертификат. Её нужно создать в корне сайта. Работаем от root пользователя.
mkdir /home/dim/www/dim.st/.well-known

Установка cerbot-auto

Это скрипт-бот, с помощью которого будет проводиться вся работа. Скачиваем "certbot-auto" в любую директорию системы, например, в "/usr/local/sbin", даём ему права на выполнение и генерируем SSL сертификаты, указывая домены, для которых будет действителен данный сертификат.
cd /usr/local/sbin
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
certbot-auto certonly -a webroot --webroot-path=/home/dim/www/dim.st -d dim.st -d www.dim.st --email i@dim.st
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Настройка Nginx

В файле конфигурации сайта, раположенного в папке "/etc/nginx/sites_available" в блок "server" добавляем параметры для SSL подлючения.
# HTTP
server
{
  listen 80;

  server_name dim.st www.dim.st;

  # перенаправление HTTP на HTTPS
  return 301 https://dim.st$request_uri;
}

# HTTPS
server
{
  #......
  
  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;
  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;
  }
  
  #......
}
Проверяем конфиг сайта на ошибки и перезагружаем веб-сервер Nginx.
nginx -t
service nginx reload

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

SSL сертификат действителен 3 месяца, после чего его нужно заново сгенерировать.
crontab -e
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log
35 2 * * 1 /etc/init.d/nginx reload

Добавление поддоменов

certbot-auto certonly -d dim.st -d www.dim.st -d aaa.dim.st -d bbb.dim.st

Файерволл iptables

iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

Работа Node.js с SSL

cp /etc/letsencrypt/live/dim.st/privkey.pem privkey.pem
cp /etc/letsencrypt/live/dim.st/fullchain.pem fullchain.pem
chown -R dim privkey.pem
chown -R dim fullchain.pem
Сервер:
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(3000);
Клиент:
$.getScript("https://dim.st:3000/socket.io/socket.io.js",function()
{
  var socket=io.connect('https://dim.st:3000',{secure: true});
});