Как получить сертификат для HTTPS бесплатно

Материал из support.qbpro.ru

Cертификат для HTTPS бесплатно

HTTPS — расширение протокола HTTP, для поддержки шифрования в целях повышения безопасности. По данным компании Mozilla на Январь 2017-го года доля зашифрованного трафика впервые превысила долю незашифрованного, передаваемого по HTTP. Ранее же Mozilla и Google объявили, что в ближайшее время в новых версиях Mozilla Firefox и Google Chrome веб-сайты, использующие незащищённый протокол будут помечаться как «небезопасные».

Решение спорное, учитывая тот факт, что подавляющее большинство Центров Сертификации (Certificate Authority, CA) выдают их после оплаты определённой суммы, которая лишь относительно недавно перестала быть трёхзначной. На сегодня вполне реально за 5-10 долларов приобрести простейший сертификат, который не подтверждает ничего, кроме того факта, что DNS записи доменного имени действительно указывают на тот сервер, на котором размещён определённый веб-сайт, тем самым ограждая пользователей от возможного фишинга. Если веб-сайт не предлагает услуг, связанных с оплатой и передачей конфиденциальной информации, то такого сертификата вполне достаточно.

Однако и такую суммы не каждый готов платить. Хотя бы по тому, что по сути своей такой сертификат мало чем отличается от самоподписанного и основное его преимущество лишь в том, что браузер не будет ругаться на то, что сертификат не выписан авторизованным CA. При этом ситуация, когда самые популярные браузеры начнут помечать протокол HTTP как «небезопасный» (а по сути так и есть), вынудит даже владельцев личных блогов задуматься о переходе на HTTPS.

На сегодня и до недавнего времени существовало три CA, выдающих ssl-сертификаты бесплатно. StartCom был первым и долгое время единственным. Уровня такого сертификата вполне достаточно для подавляющего числа блогов, форумов и прочих ресурсов, до сих пор сидящих на HTTP.

Однако после продажи StartCom китайскому CA WoSign и эпичного залёта последнего, когда по технической ошибке был выписан сертификат на корневой домен GitHub.com лицу, никаким боком не имеющему отношения к руководству ресурса, в соответствующих кругах начался шторм. И поскольку WoSign не достаточно активно выражал покаяние и практически никак не пытался исправить ситуацию, заявив, что будет отзывать сертификаты, ошибочно выданные с использованием дыры, только по запросу владельцев этих сертификатов (!), под раздачу попал и StartCom, так как корневые сертификаты у них и у WoSign выписаны с использованием одних и тех же алгоритмов. Начиная с января 2017-го года в новых версиях браузеров Google, Mozilla и Apple сертификаты, выданные StartCom после конца октября 2016-го года, помечены как «не доверенные». То есть ничем не отличаются от самоподписанных.

Но к счастью для рядовых владельцев вполне рядовых форумов и блогов, остался третий CA, выдающий сертификаты бесплатно. Процесс выдачи сертификатов Let’s Encrypt в корне отличается от всего того, что используют другие CA. Администратору ресурса не нужно заводить аккаунт и как-либо взаимодействовать с ресурсом Let’s Encrypt. Всё что нужно — это доступ к собственному серверу по ssh и 5-10 минут свободного времени.

Приступим.

Рекомендованная Let’s Encrypt и подходящая для большинства пользователей программа — Certbot ACME. Это программа, установленная на сервер, способная практически полностью автоматизировать процесс получения, а так же продления сертификатов. Что важно, так как сертификаты Let’s Encrypt имеют достаточно короткий срок жизни — три месяца. Certbot работает только в UNIX-Like операционных системах (Linux, *BSD и Mac OS X) и поддерживает несколько типов веб-серверов, среди которых Apache и Nginx. Но перечень не ограничивается этими двумя. В данном примере я использую Ubuntu 16.04 и Apache. Для других конфигураций посмотрите инструкции на официальном сайте проекта.

Устанавливаем Sertbot.

sudo apt install python-letsencrypt-apache 


Чтобы не нарушить работу активных сайтов и во избежании конфликтов конфигурации, убедитесь что конфигурационные файлы HTTP хостов у вас в порядке, а конфигурационные файлы HTTPS хостов (если таковые уже имеются) отключите. Sertbot сам создаст конфигурацию на основе имеющихся HTTP хостов, если требуется, подключит модуль ssl, добавит хосты HTTPS и перезагрузит Apache.

Запускаем Sertbot.

sudo letsencrypt --apache


Далее следуйте инструкциям в терминале. Вам будет предложено указать адрес вашей действующей электронной почты, а так же доменные имена из списка активных хостов. Sertbot убедится, что DNS записи доменных имён ваших хостов совпадают с IP адресом сервера, на котором Serbot запущен, сгенерирует сертификаты, создаст виртуальные HTTPS хосты и пропишет в них путь до сертификатов. В конце Sertbot предложит вписать редирект для HTTP хостов, что будет перенаправлять все запросы к ним на HTTPS. Решайте сами. Вся процедура занимает не больше минуты; по завершении процедуры ничего делать не нужно. Всё установлено и работает.

Обновление.

Sertbot может быть настроен на обновление сертификатов, срок действия которых подходит к концу. Поскольку сертификаты действительны лишь 90 дней, то данная опция рекомендована к использованию. Особенно, если у вас много хостов и сертификаты на них выписаны в разное время. Проверить состояние данной опции можно при помощи следующей команды:

sudo letsencrypt renew --dry-run --agree-tos


В текущей версии Serbot под Ubuntu 16.04 есть небольшой баг, в связи с которым вам вылетит сообщение о том, что при регистрации сертификатов не указан email. Пример:

2017-02-07 17:06:06,662:WARNING:letsencrypt.client:Registering without email!


Сообщение можно проигнорировать. Это не как не повлияет на процесс обновления. Дождитесь завершения команды. Вывод примерно следующий:

Congratulations, all renewals succeeded. The following certs have been renewed: 
 /etc/letsencrypt/live/yourdomain.name/fullchain.pem (success) 
** DRY RUN: simulating 'letsencrypt renew' close to cert expiry 
**          (The test certificates above have not been saved.) 

IMPORTANT NOTES: 
- Your account credentials have been saved in your Let's Encrypt 
  configuration directory at /etc/letsencrypt. You should make a 
  secure backup of this folder now. This configuration directory will 
  also contain certificates and private keys obtained by Let's 
  Encrypt so making regular backups of this folder is ideal.


Здесь так же рекомендуется периодически делать бэкап директории /etc/letsencrypt, так как в ней хранятся все сертификаты и ключи.

Вы можете выполнять команду «letsencrypt renew» вручную, или настроить её автоматическое выполнение с помощью cron или systemd. В этом случае разработчики рекомендуют запускать её дважды в день. Это никак не повлияет на те сертификаты, срок которых далёк от истечения. Но позволит избежать неприятностей с просроченными, или отозванными сертификатами.

Решение Проблем

  • [Решение] Let's Encrypt, Nginx и 403 ошибка
При ручном получении / продлении сертификата для домена на сервере с Ngnix может возникнуть ошибка 403 Forbidden при обращении к проверочному файлу:

Make sure your web server displays the following content at
http://site.com/.well-known/acme-challenge/xOtn064NspTWyHkbp6EOM140COWK82PW3v7sOf87kM8 before continuing:

xOtn064NspTWyHkbp6EOM140COWK82PW3v7sOf87kM8.wDLw7SyOVXqZ6Ky635Vc9rgUXobw2uLFgM5S9AukTrk

If you don't have HTTP server configured, you can run the following
command on the target server (as root):

mkdir -p /tmp/certbot/public_html/.well-known/acme-challenge
cd /tmp/certbot/public_html
printf "%s"xOtn064NspTWyHkbp6EOM140COWK82PW3v7sOf87kM8.wDLw7SyOVXqZ6Ky635Vc9rgUXobw2uLFgM5S9AukTrk > .well-known/acme-
challenge/xOtn064NspTWyHkbp6EOM140COWK82PW3v7sOf87kM8
# 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()"
-------------------------------------------------------------------------------
Press Enter to Continue

Waiting for verification...
Cleaning up challenges
Failed authorization procedure. bulkin.me (http-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid 
response from http://site.com/.well-known/acme-challenge/xOtn064NspTWyHkbp6EOM140COWK82PW3v7sOf87kM8:...

В этом случае в конфиге Nginx необходимо прописать следующий location:

location ^~ /.well-known/acme-challenge/ {
allow all;
default_type "text/plain";
}

После перезапуска Nginx (/etc/init.d/nginx restart) ошибки доступа к проверочному файлу уже не будет.

  • SSL Let's Encrypt - ошибка: Failed authorization procedure.

Решил переехать на новый сервер Для нового домена Let's Encrypt сработал на ура. А вот при подключении старого домена (который работал на https на другом IP), возникла ошибка CODE: SELECT ALL

letsencrypt-vesta apartik apartik.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for apartik.com
http-01 challenge for www.apartik.com
Using the webroot path /etc/letsencrypt/webroot for all unmatched domains.
Waiting for verification...
Cleaning up challenges
Failed authorization procedure. www.apartik.com (http-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: 
The key authorization file from the server did not match this challenge [AH03C3yVIJI-8AT421rPLG-60MPtL2xQUarCB41Nb-0.b-
K7w05BwJOGvg4VWlZF99C5h14CICoqt5-gPbmeSK8] != [AH03C3yVIJI-8AT421rPLG-60MPtL2xQUarCB41Nb-0.bVialEFXSokbIo3usG6esE2iPU1ix82ONJ6M4suXsQs], 
apartik.com (http-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: The key authorization file from the 
server did not match this challenge [nbqRV0UI73YrelMsr_I_FXMrICF6lH8nRfAQYQyw_vY.b-K7w05BwJOGvg4VWlZF99C5h14CICoqt5-gPbmeSK8] != 
[nbqRV0UI73YrelMsr_I_FXMrICF6lH8nRfAQYQyw_vY.bVialEFXSokbIo3usG6esE2iPU1ix82ONJ6M4suXsQs]
IMPORTANT NOTES:
 - The following errors were reported by the server:
  Domain: www.apartik.com
  Type:   unauthorized
  Detail: The key authorization file from the server did not match
  this challenge
  [AH03C3yVIJI-8AT421rPLG-60MPtL2xQUarCB41Nb-0.b-K7w05BwJOGvg4VWlZF99C5h14CICoqt5-gPbmeSK8]
  !=
  [AH03C3yVIJI-8AT421rPLG-60MPtL2xQUarCB41Nb-0.bVialEFXSokbIo3usG6esE2iPU1ix82ONJ6M4suXsQs]
  Domain: apartik.com
  Type:   unauthorized
  Detail: The key authorization file from the server did not match
  this challenge
  [nbqRV0UI73YrelMsr_I_FXMrICF6lH8nRfAQYQyw_vY.b-K7w05BwJOGvg4VWlZF99C5h14CICoqt5-gPbmeSK8]
  !=
  [nbqRV0UI73YrelMsr_I_FXMrICF6lH8nRfAQYQyw_vY.bVialEFXSokbIo3usG6esE2iPU1ix82ONJ6M4suXsQs]
  To fix these errors, please make sure that your domain name was
  entered correctly and the DNS A record(s) for that domain
  contain(s) the right IP address.
Let's Encrypt returned an error status.  Aborting.

A запись для домена я поменял 15 часов назад, у меня домен еще вчера начал указывать на новый ip.

... я так понимаю проблема в том что не обновлялся файл

/home/{USER}/conf/web/nginx.{DOMAIN}.conf_letsencrypt

который отвечает за выдачу

http://{DOMAIN}/well-known/acme-challenge/

после удаления этого файла и запуска

letsencrypt-vesta {user} {domain} - все заработало без ошибок

...

ИСТОЧНИКИ: