После того, как сайт sslforfree.com обновился, многие стали чесать репу по поводу того, где же теперь брать TLS (SSL) сертификаты без оплаты. Сервис предлагает использовать 90 дней сертификат без оплаты, но затем нужно платить деньги, чтобы продлить сертификат и/или выпустить другие (более 3-х).

Как я писал ранее, поосторожнее с certbot...

Благодаря Вадиму Макееву, который все объяснил по полочкам, теперь Вы сможете получать сертификаты полу-автоматически и без оплаты (и даже после 3-х месяцев — тоже без оплаты!).

Документация по certbot.

Вот, что Вам необходимо сделать:

  1. Установить nginx. А, если он уже у Вас был установлен, Вам НЕ придется ничего переустанавливать.
  2. Если уже установлен, то нужно остановить nginx!
  3. Выполнить команду:
    apt-add-repository -y ppa:hda-me/nginx-stable
  4. Далее:
    apt-get install software-properties-common
  5. Также:
    add-apt-repository ppa:certbot/certbot
  6. apt-get update
  7. apt-get install python-certbot-nginx
  8. openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
  9. Создайте файл /etc/nginx/snippets/ssl-params.conf
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1h;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK;
    #add_header Strict-Transport-Security max-age=15768000;
    ssl_stapling on;
    ssl_stapling_verify on;
  10. Выполнив команду:
    certbot --nginx certonly
    мы получаем список всех доменов и поддоменов, которые доступны на нашем сервере и можем выбрать для каких именно мы хотим создать TLS-сертификаты. Вводим ТОЛЬКО номер домена, на который необходимо поставить TLS. Например, нам выдаст что-то типа:
    Saving debug log to /var/log/letsencrypt/letsencrypt.log
    Plugins selected: Authenticator nginx, Installer nginx

    Which names would you like to activate HTTPS for?
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    1: lawyer.com.ua
    2: www.lawyer.com.ua
    3: dev4.later.pro
    4: www.dev4.later.pro
    5: order.later.pro
    6: shop.later.pro
    7: www.shop.later.pro
    8: file.prod.org
    9: www.file.prod.org
    10: smile.prod.org
    11: www.smile.prod.org
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Select the appropriate numbers separated by commas and/or spaces, or leave input
    чтобы выбрать ТОЛЬКО smile.prod.org и file.prod.org, нужно ввести 8 ПРОБЕЛ 10.
    У меня почему-то не хочет создавать сертификаты для двух и более доменов одновременно, поэтому я сначала создаю для одного (например, 8), затем для следующего (например, 10), выполняя каждый раз команду certbot --nginx certonly.
  11. Успешное сообщение:

    IMPORTANT NOTES:
    - Congratulations! Your certificate and chain have been saved at:
    /etc/letsencrypt/live/www.site.pro/fullchain.pem
    Your key file has been saved at:
    /etc/letsencrypt/live/www.site.pro/privkey.pem
    Your cert will expire on 2021-06-23. To obtain a new or tweaked
    version of this certificate in the future, simply run certbot
    again. To non-interactively renew *all* of your certificates, run
    "certbot renew"
    - If you like Certbot, please consider supporting our work by:

    Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
    Donating to EFF: https://eff.org/donate-le
  12. После этого, безусловно, старые настройки сертификатов нужно заменить на новые, в настройках самого домена, например: /etc/nginx/sites-available/file.prod.org.conf:
    ЗАМЕНИТЬ ЭТО (старые пути к файлам сертификата):
    ssl_certificate /etc/nginx/cert/file/certificate.crt;
    ssl_certificate_key /etc/nginx/cert/file/private.key;
    ssl_dhparam /etc/nginx/cert/file/dhparam.pem;
    НА:
    ssl_certificate /etc/letsencrypt/live/file.prod.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/file.prod.org/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/file.prod.org/chain.pem;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    После этого, мой nginx отказался напрочь перезапускаться. Произошла какая-то магия, которая не давала мне: 1) убить сам процесс стандартным способом, 2) перезапустить/остановить nginx. Пришлось выполнить что-то из этого, что именно помогло я не знаю:

    /etc/init.d/nginx stop
    lsof -i | grep nginx
    гуглите:
    https://stackoverflow.com/questions/8857358/nginx-daemon-stop-is-failing
    https://stackoverflow.com/questions/18576845/how-to-kill-this-immortal-nginx-worker
  13. При возникновении ошибки, введите:
     systemctl status nginx.service
  14. Должно что-то подсказать:
    nginx.service: Failed with result 'exit-
    Mar 25 20:43:10 client systemd[1]: Failed to start nginx - high performance
    lines 1-13/13 (END)...skipping...
    ● nginx.service - nginx - high performance web server
    Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
    Active: failed (Result: exit-code) since Thu 2021-03-25 20:43:10 EET; 12s ago
    Docs: http://nginx.org/en/docs/
    Process: 22398 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=1/FAILURE)

    Mar 25 20:43:10 client systemd[1]: Starting nginx - high performance web server...
    Mar 25 20:43:10 client nginx[22398]: nginx: [warn] duplicate MIME type "woff2" in /etc/nginx/nginx.conf:129
    Mar 25 20:43:10 client nginx[22398]: nginx: [warn] duplicate MIME type "text/html" in /etc/nginx/nginx.conf:129
    Mar 25 20:43:10 client nginx[22398]: nginx: [emerg] cannot load certificate "/etc/letsencrypt/live/site.pro/fullchain.pem": BIO_new_file() failed (SSL: error:02001002:system library:fopen:No such file or dir
    Mar 25 20:43:10 client systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
    Mar 25 20:43:10 client systemd[1]: nginx.service: Failed with result 'exit-code'.
    Mar 25 20:43:10 client systemd[1]: Failed to start nginx - high performance web server.
  15. Бывает, что на сервере установлен также apache, и он занимает 80-тый порт. Чтобы проверить, что занимает 80 порт (стандартный порт для www), нужно выполнить:
    netstat -tulpn | grep :80
  16. Тестим nginx:
    nginx -t
  17. Должно быть все ok. Запускаем:
    service nginx start
  18. Также можно использовать webroot команду, чтобы проверить действительно ли требуемый сайт лежит на Вашем сервере. Это особенно полезно для новых сайтов и для тех случаев, когда проверочный бот не может достучаться до конкретного ресурса.
    certbot certonly --webroot -w /var/www/html/site.pro -d www.site.pro -d site.pro

    где /var/www/html/site.pro — путь к каталогу, где расположен сайт
    www.site.pro и site.pro — доменное имя.

  19. Можно проверить сайт на TLS.
  20. Результат: