[[Настройка сертификатов от Let’s Encrypt]]

Настройка сертификатов от Let’s Encrypt

Let’s Encrypt — центр сертификации, предоставляющий бесплатные криптографические сертификаты X.509 для SSL/TLS-шифрования.

Однако есть некоторые ограничения, например сертификат выдается сроком на 90 дней.

Существует несколько ACME Client (Automated Certificate Management Environment) утилит для настройки автоматизации процесса.

Настройка GetSSL

getssl - Obtain SSL certificates from the letsencrypt.org ACME server. Реализован на bash

Создание пользователя letsencrypt

useradd letsencrypt -mU -s /bin/bash
chmod 750 /home/letsencrypt

su - letsencrypt
mkdir ~/bin
cd ~/bin/
wget https://raw.githubusercontent.com/srvrco/getssl/master/getssl
chmod +x getssl

Повторно зайти, что бы ~/bin подхватился в PATH

exit
su - letsencrypt 
getssl --help

PATH зависит от дистрибутива, можно порписать вручную

~/.bashrc

export PATH=$PATH:$HOME/bin

Создать конфиг для домена example.com

getssl -c example.com

По умолчанию конфиг размещается в ~/.getssl. В этой папке находятся:

  • getssl.cfg - main config file. Общий конфиг утилиты и конфиг аккаунта.

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

https://github.com/ietf-wg-acme/acme/blob/master/draft-ietf-acme-acme.md

An ACME client is represented by an "account key pair". The client uses the private key of this key pair to sign all messages sent to the server. The server uses the public key to verify the authenticity and integrity of messages from the client.

  • example.com/getssl.cfg - domain config file. Папка с именем домена и индивидуальным под него конфигом



Прежде чем начать генерировать сертификаты, убедимся что мы работает со staging средой

~/.getssl/getssl.cfg

CA="https://acme-staging.api.letsencrypt.org"

Сервис имеет ограничение на кол-во запросов в prod и staging

Если сертификат генерируется для домена 2ого уровня example.com, а так же хотим работать с ним как www.example.com, то необходимо указать альтернативные имена SAN (Subject Alternative Name)

~/.getssl/example.com/getssl.cfg

SANS="www.example.com"

При получении сертификата letsencrypt проверяет право владения доменом(ами). Для этого он обратиться к нашему серверу по адресу(ам):

http://example.com/.well-known/acme-challenge/<token file>
http://www.example.com/.well-known/acme-challenge/<token file>

Настраиваем место хранения token файлов

~/.getssl/getssl.cfg

ACL=('/home/letsencrypt/.well-known/acme-challenge')
USE_SINGLE_ACL="true"

Т.к. у нас два домена на подтверждение, то в ACL потребуется указать столько же директорий для token файлов.
Что бы этого не делать используем опцию USE_SINGLE_ACL
Кроме подтверждения по HTTP, можно использовать FTP, SSH, … см. man настройки ACL

Настраиваем создание PEM файла, т.к. по умолчанию такой файл не создается

~/.getssl/getssl.cfg

DOMAIN_PEM_LOCATION="${DOMAIN}.pem" # this is the domain_key, domain cert and CA cert

Я сделал настройки ACL и DOMAIN_PEM_LOCATION в глобальном конфиге

Настройка Nginx (Этап 1)

Сделаем доступной папку acme-challenge на всех доменах

/etc/nginx/sites-enabled/example.com.conf

server {
        server_name example.com www.example.com;
...
        ### letsencrypt
        location /.well-known/acme-challenge {
                allow all;
                root /home/letsencrypt;
        }
...

Не забудем про права, файлы должны быть доступны для web сервера

chown :www-data /home/letsencrypt

Перезагружаем

/etc/init.d/nginx reload

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

su - letsencrypt
getssl example.com

Если появляются ошибки - смотрим и исправляем:
  • Неправильно настроен web сервер, token файл недоступен

getssl: for some reason could not reach http://example.com/.well-known/acme-challenge/Pfommk2UwBNwYWcizkuzZeZHybAztSQ5jcrf9ZIMxn8 - please check it manually

  • Это не ошибка, просто сейчас у меня самаподписанный сертификат, да и пока мы еще в тестовом режиме

getssl: example.com - certificate obtained but certificate on server is different from the new certificate

Тестовые сертификаты сгенерировались

$ ls -la ~/.getssl/example.com/
-rw-r--r-- 1 letsencrypt letsencrypt 2139 Jan 24 18:11 example.com.crt
-rw-r--r-- 1 letsencrypt letsencrypt 1651 Jan 24 18:11 example.com.csr
-rw------- 1 letsencrypt letsencrypt 3243 Jan 24 18:11 example.com.key
-rw-r--r-- 1 letsencrypt letsencrypt 2139 Jan 24 18:11 example.com.pem

Посмотрим на них

openssl rsa -noout -check -in example.com.key
openssl req -noout -text -in example.com.csr
openssl x509 -noout -text -in example.com.crt 
Сертификаты как сертификаты, только издатель не валидный
 CN=Fake LE Intermediate X1

Теперь как мы проверили, что все у нас работает, сертификаты получились, переключаемся на prod, для получения валидных

/home/letsencrypt/.getssl/getssl.cfg

#CA="https://acme-staging.api.letsencrypt.org"
CA="https://acme-v01.api.letsencrypt.org"

Генерируем

getssl example.com

Посмотрим на новый сертификат

$ openssl x509 -noout -text -in example.com.crt  | grep Iss
Issuer: C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3

То что нужно!

Настройка Nginx (Этап 2)

Настроим пути к сертификатам

/etc/nginx/sites-enabled/example.com.conf

server {
...
        ssl_certificate     /home/letsencrypt/.getssl/example.com/example.com.pem;
        ssl_certificate_key /home/letsencrypt/.getssl/example.com/example.com.key;


...

Перезагружаем

/etc/init.d/nginx reload

Проверяем через браузер. Так же проверяем через какой-нибудь сервис, например https://www.ssllabs.com/

Настройка CRON

Настроим автоматическое обновление сертификата(ов) по cron'y.

Т.к. сертификат годен 3 месяца, я немного увеличу RENEW_ALLOW - кол-во дней, через которое getssl будет готов обновить сертификат. С 30 по-умолчанию до 60 дней. И пропишем команду на автоматическую перезагрузку после обновления.

su - letsencrypt

~/.getssl/getssl.cfg

RENEW_ALLOW="60"
RELOAD_CMD="sudo /etc/init.d/nginx reload"

Права в sudo

/etc/sudoers.d/letsencrypt

letsencrypt ALL=(root) NOPASSWD: /etc/init.d/nginx reload

Проверим как работает

$ getssl -a
Check all certificates
example.com: certificate is valid for more than 60 days (until Apr 25 18:03:06 2018 GMT)

Срок сертификата еще не вышел и обновляться он не будет, что логично, но все такие проверим через --force

$ getssl -f example.com
Registering account
Verify each domain
Verifying example.com
example.com is already validated
Verification completed, obtaining certificate.
Certificate saved in /home/letsencrypt/.getssl/example.com/example.com.crt
The intermediate CA cert is in /home/letsencrypt/.getssl/example.com/chain.crt
reloading SSL services
 * Reloading nginx configuration [ OK ]
example.com - certificate installed OK on server
certificate obtained for example.com

Перезагрузка сработала. Добавляем в cron

/etc/cron.d/letsencrypt

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/home/letsencrypt/bin
MAILTO="root"

0 9  * * 1  letsencrypt /home/letsencrypt/bin/getssl -a -q








Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
227᠎ +11 = ?
 
howto/ssl/letsencrypt.txt · Последние изменения: 2018/01/29 15:52 — lexa
Gentoo Linux Driven by DokuWiki