Авто обновление SSL сертификата Let’s Encrypt

Создание доверенного ssl сертификата.


Для своего сайта было принято решение использовать ssl шифрование, но самоподписной сертификат оказался совсем не удобным решением, потому как по несколько раз кликать по сообщениям браузера об опастности данной ссылки ну совсем не прикольно. К счастью есть сервис Let’s Encrypt у которого можно получить доверенный ssl сертификат. Правда как у всякой халявы есть свои недостатки :

Срок действия бесплатного SSL-сертификата – до 90 дней.

Бесплатные сертификаты от Let's Encrypt являются сертификатами с проверкой домена (англ. domain validation). То есть, если вам нужно защитить домен и его субдомены, то нужно будет выпускать несколько сертификатов.

Также нельзя получить бесплатные сертификаты с проверкой организации (англ. Organization validation), сертификаты с зеленой строкой (англ. Extended validation), мультидоменные сертификаты (Multi-domain SSL).

Если у вас IDN домен, например, мойдомен.com, то бесплатный SSL от Let's Encrypt уже не подойдет.

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

Есть два способа сделать это в автоматическом режиме, чтобы не заказывать ручками сертификат раз в 3 месяца.

1. Установка клиента certbot для  автоматической генерации сертификатов.

Заходим на сайт https://certbot.eff.org/ и выбираем в списке ваш web-сервер и операционную систему. Там будет подробное описание как устанавливать клиент. Для Ubuntu 14.04 это выглядит так:

mkdir /opt/letsencrypt

cd /opt/letsencrypt

./certbot-auto

Дальше читаем что пишет нам скрипт, до самого конца установки.

Если нужно добавить еще доменное имя в настроенный letsencrypt, то пишем команду:

certbot certonly --cert-name mydomain.sytes.net -d mydomain.sytes.net

2. Установка и обновление сертификата с помощью скрипта getssl который написан на bash.

Этот метод более понятен и вызывает меньше переживаний, так как в отличие от certbot тут понятен каждый шаг скрипта.

Для начала нам надо создать Alias в Apache.

nano /etc/apache2/apache2.conf

Alias /.well-known/acme-challenge /var/www/getssl/web/.well-known/acme-challenge

<Directory /var/www/getssl/.well-known/acme-challenge>

AllowOverride All

# Apache 2.4

<IfModule mod_authz_core.c>

Require all granted

</IfModule>

</Directory>

Этот алиас будет отображать папку /var/www/getssl/.well-known/acme-challenge  по ссылке https://yousite.net/.well-known/acme-challenge/

У нас запрещен просмотр содержимого директорий, поэтому создадим файл .htaccess

nano /var/www/getssl/web /.well-known/acme-challenge/.htaccess

с содержимым:

Options +Indexes

теперь создадим там любой файл и зайдем по ссылке https://yousite.net/.well-known/acme-challenge/ , теперь мы должны его там увидеть.

cd /root

curl --silent https://raw.githubusercontent.com/srvrco/getssl/master/getssl > getssl

chmod 700 getssl

Поместить скрипт в /bin, чтобы не указывать полный путь при запуске:

mv getssl /bin/
apt-get install -y openssl dnsutils openssh-client

Если установка прошла успешно команда getssl сообщит свою версию:

getssl

getssl ver. 1.37

Obtain SSL certificates from the letsencrypt.org ACME server

Usage: getssl [-h|--help] [-d|--debug] [-c|--create] [-f|--force] [-a|--all] [-q|--quiet] [-u|--upgrade] [-w working_dir] domain

Options:

-h, --help Display this help message and exit

Доменная модель GetSSL оперирует двумя видами сущностей:

Аккаунт - глобальный набор правил распространяемых на сервер;

Домен - набор правил для конкретного доменного имени.

Добавим новый домен:

getssl -c yousite.net

creating main config file /root/.getssl/getssl.cfg

Making domain directory - /root/.getssl/domain.tld

creating domain config file in /root/.getssl/domain.tld/getssl.cfg

 

Настройка аккаунта.

Let's Encrypt ограничивает лимит запросов к своим серверам. Для отладочных целей лучше использовать stagging сервер:

nano /root/.getssl/getssl.cfg

CA="https://acme-staging.api.letsencrypt.org" # Сервер для отладки

#CA="https://acme-v01.api.letsencrypt.org" # Сервер центра сертификации

Глобально принять соглашение предоставления услуг и указать свой email:

AGREEMENT="https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf"

ACCOUNT_EMAIL="admin@domain.tld"

Настройка домена.

При получении сертификата Let's Encrypt проверяет права владения доменом(ами). Флаг ACL (ACME Challenge Location) указывает на директорию в которую будет сохранено выполненное задание (challenge):

Установите флаг USE_SINGLE_ACL для использование одной директории при подтверждении прав на домены.

Флаги DOMAIN_CERT_LOCATION, DOMAIN_KEY_LOCATION, CA_CERT_LOCATION используются для копирования цепочки сертификатов и закрытого ключа в директорию к которой веб сервер имеет доступ.

nano /root/.getssl/yousite.net/getssl.cfg

PRIVATE_KEY_ALG="rsa"

ACL=('/var/www/onedayadmin.sytes.net/web/.well-known/acme-challenge'
'ssh:server5:/var/www/onedayadmin.sytes.net/web/.well-known/acme-challenge'
'ssh:sshuserid@server5:/var/www/onedayadmin.sytes.net/web/.well-known/acme-challenge'
'ftp:ftpuserid:ftppassword:onedayadmin.sytes.net:/web/.well-known/acme-challenge')

USE_SINGLE_ACL="true"

DOMAIN_CERT_LOCATION="/etc/ssl/yousite.net.crt"

DOMAIN_KEY_LOCATION="/etc/ssl/yousite.net.key"

CA_CERT_LOCATION="/etc/ssl/chain.crt"

RELOAD_CMD="service apache2 reload"

SERVER_TYPE="https"

Получение демо сертификата.

getssl yousite.net

Если GetSSL сообщил о успешном получении сертификата (Verification completed, obtaining certificate.), измените CA в конфигурационном файле аккаунта /root/.getssl/getssl.cfg сервер сертификации:

#CA="https://acme-staging.api.letsencrypt.org" # Сервер для отладки

CA="https://acme-v01.api.letsencrypt.org" # Сервер центра сертификации

Затем повторите запрос ещё раз:

getssl -f yousite.net

Настроим apache, поправим данные строки:

nano /etc/apache2/sites-available/default-ssl.conf

<IfModule mod_ssl.c>

<VirtualHost _default_:443>

ServerAdmin mail@mail.ru@mail.ru

ServerName https://namedomain.net

DocumentRoot /var/www/directory_domain.net

ErrorLog ${APACHE_LOG_DIR}/error.log

CustomLog ${APACHE_LOG_DIR}/access.log combined

SSLEngine on

SSLCertificateFile /etc/ssl/namedomain.net.crt

SSLCertificateKeyFile /etc/ssl/namedomain.net.key
SSLProtocol all -SSLv2
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>

#для доступа к админке с применением .htaccess

<Directory /var/www/namedomain.net/admin_directory/>

AllowOverride All

Order allow,deny

Allow from all

</Directory>

BrowserMatch "MSIE [2-6]" \

nokeepalive ssl-unclean-shutdown \

downgrade-1.0 force-response-1.0

BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

ServerAlias namedomain.net

SSLCertificateChainFile /etc/ssl/chain.crt

</VirtualHost>

</IfModule>

Теперь автоматизируем замену сертификатов.

nano /etc/crontab
00 1 * */2 * root getssl -f yousite.net