Переводим сайт на бесплатный SSL сертификат

Let's Encrypt позволяет получить бесплатный SSL сертификат автоматически, без регистрации и СМС! Дело нескольких минут. И этот сертификат воспринимают все популярные браузеры!

Без установки ПО: https://www.sslforfree.com/

Гид по SSL

Гугл предпочитает https, но SAPE не работает с https.

Установка необходимо ПО

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

Получение бесплатного SSL сертификата

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

При этом попросят ввести пароль, чтобы скрипт запустился с правами root.

Далее необходимо ввести все домены, на которые необходимо получить сертификаты, через пробел и/или запятую. Далее предложат записать в публичный лог о получении сертификата, соглашаемся.

После чего получим следующее сообщение:

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

abcdef-abcdef-abcdef

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

mkdir -p /tmp/letsencrypt/public_html/.well-known/acme-challenge
cd /tmp/letsencrypt/public_html
printf "%s" abcdef-abcdef-abcdef > .well-known/acme-challenge/abcdef-abcdef-abcdef
# 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()"

Таким образом, для проверки необходимо создать файл .well-known/acme-challenge/abcdef-abcdef-abcdef с содержимым abcdef-abcdef-abcdef, который бы открывался по ссылке http://site.ru/.well-known/acme-challenge/abcdef-abcdef-abcdef

Проверяем, чтобы отдавались правильные заголовки и ответ:

curl --head http://site.ru/.well-known/acme-challenge/abcdef-abcdef-abcdef
HTTP/1.1 200 OK
curl http://site.ru/.well-known/acme-challenge/abcdef-abcdef-abcdef
abcdef-abcdef-abcdef

После этого нажимаем Enter в программе получения сертификатов. Если ввести несколько сайтов, программа интерактивно предложит проделать те же самые шаги для остальных доменов.

Если после создания файла вместо него отдается страница CMS, необходимо настроить веб-сервер. А также на будущее, для следующих установок сертификатов, когда поставим редирект http => https.

На примере Apache, сразу после RewriteEngine on вставляем:

# отдаем файлы для проверки Let's Encrypt сразу
RewriteRule ^(\.well-known/.*) - [L]

Если в .htaccess корня сайта стоит AuthType Basic, отключить в каталоге ее можно размещением следующего файла:

.htaccess
Allow from all
Satisfy Any

Если отдаются неправильные заголовки, их можно отключить:

.htaccess
Header unset Content-Type

В случае успеха, получим сообщение об этом:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/site.ru/fullchain.pem. Your cert will
   expire on 2016-03-18. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.
 - If you like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Установка полученных сертификатов

Теперь необходимо прописать в настройки веб-сервера пути к сертификатам и сделать редирект на https.

Так как сертификаты выдаются на 3 месяца (такая политика - чем чаще меняем сертификат, тем меньше вероятность, что сертификат будет скомпрометирован, а также таким способом навязывается автоматизация получения сертификатов), вместо копирования файлов лучше поставить на них симлинки, это будет удобнее.

Файл Назначение Apache nginx
privkey.pem приватный ключ для сертификата SSLCertificateKeyFile ssl_certificate_key
cert.pem сертификат сервера SSLCertificateFile :-:
chain.pem сертификат цепочки (не обязательно) SSLCertificateChainFile :-:
fullchain.pem соединение chain.pem и cert.pem ssl_certificate

Apache

Для активации SSL сертификатов 10.0.0.1 заменить на свой IP, и прописать в конфиге индейца:

site.conf
<VirtualHost 10.0.0.1:80 10.0.0.1:443>
SSLEngine on
SSLCertificateFile /var/www/httpd-cert/vds/site.ru.crt
SSLCertificateChainFile /var/www/httpd-cert/vds/site.ru.chain.crt
SSLCertificateKeyFile /var/www/httpd-cert/vds/site.ru.key
</VirtualHost>

Для редиректов с www и http на https:

.htaccess
# 301 редирект с адресов с www на адреса без www
RewriteCond %{HTTP_HOST} ^www\.site\.ru$ [NC]
RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L]
 
# Редирект на HTTPS
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Nginx

site.conf
server {
  listen 443;
  ssl on;
  ssl_certificate /etc/ssl/site.crt;
  ssl_certificate_key /etc/ssl/site.key;
}

Продление сертификата

До просрочки будут приходить письма напоминания о необходимости продления сертификата такого рода:

Hello,

Your certificate (or certificates) for the names listed below will expire in
0 days (on 25 Feb 17 17:21 +0000). Please make sure to renew
your certificate before then, or visitors to your website will encounter errors.

pushorigin.ru

For any questions or support, please visit https://community.letsencrypt.org/.
Unfortunately, we can't provide support by email.

For details about when we send these emails, please visit
https://letsencrypt.org/docs/expiration-emails/. In particular, note
that this reminder email is still sent if you've obtained a slightly
different certificate by adding or removing names. If you've replaced
this certificate with a newer one that covers more or fewer names than
the list above, you may be able to ignore this message.

If you want to stop receiving all email from this address, click
http://mandrillapp.com/track/unsub.php?u=...
(Warning: this is a one-click action that cannot be undone)

Regards,
The Let's Encrypt Team

Само продление:

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

Надо не забыть перегрузить веб-сервер!

По материалам статьи.