SSL - andyceo/documentation GitHub Wiki
Сертификат - это метод распространения открытого ключа и другой информации о сервере и организации, ответственной за него. Сертификат может иметь цифровую подпись, которая сделана центром сертификации (CA).
Для того, чтобы использовать сертификат, как правило, надо осуществить следующие действия:
- Сгенерировать открытый и закрытый ключи сервера
- Создать запрос на сертификат: CSR (включающий открытый ключ, информацию о сервере, и управляющей им компании). Запрос представляет собой текстовый файл, содержащий в закодированном виде информацию об администраторе домена и открытый ключ.
- Отправить файл запроса центру сертификации (CA), вместе с подтверждающими документами
- Центр проверяет запрос на сертификат и вашу идентичность, и затем отсылает в ответ сертификат для вашего сервера
- Установить полученный сертификат на сервер и настроить нужные приложения на его использование
Ссылки:
Этот раздел описывают все действия, необходимые, чтобы сгенерировать открытый и закрытый ключи сервера, и создать запрос на сертификат (включающий открытый ключ, информацию о сервере, и управляющей им компании) (пункты 1. и 2.) Для создания самоподписанного сертификата, можно сразу перейти к разделу Создание самоподписанного сертификата.
Также, вместо используемых в инструкции имен ключей server.key.strong
и server.key
, лучше использовать имена, созданные на основе имени хоста, например, myhostname.key
. Узнать имя хоста можно командой hostname
.
-
Сгенерируем запароленный безопасный приватный ключ сервера
server.key.strong
:openssl genrsa -des3 -out server.key.strong 2048
Здесь надо обязательно ввести свою кодовую фразу на этот ключ. Этот ключ будет зашифрован этой кодовой фразой. Минимальная длина пароля - 4 символа, лучше 20. Этот ключ в следующем шаге будет использован для генерации другого ключа, без кодовой фразы, который будет использован для создания CSR, и этот второй ключ без кодовой фразы будет использован приложениями, работающими с SSL.
-
Теперь, на основе безопасного ключа
server.key.strong
, создадим небезопасный ключserver.key
, без кодовой фразы:openssl rsa -in server.key.strong -out server.key
Будет запрошен пароль от ключа
server.key.strong
. -
Используя небезопасный ключ без пароля
server.key
, создадим CSR:openssl req -new -key server.key -out server.csr
Будет спрошено:
Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Moscow Locality Name (eg, city) []:Moscow Organization Name (eg, company) [Internet Widgits Pty Ltd]:Ruware Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:andyceo Email Address []:[email protected] Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
Краткое описание дополнительных полей:
The "challenge password" is basically a shared-secret nonce between you and the SSL issuer, embedded in the CSR, which the issuer may use to authenticate you should that ever be needed. This field ("optional company name") is part of the certificate request; The certificate issuer may look up this name or not. But this field will not appear in the resulting certificate, unlike organizationName.
-
Создаем самоподписанный сертификат на основе уже имеющегося файла запроса сертификата (CSR)
server.csr
(можно использовать файл, сгенерированный в пункте Создание запроса на подпись сертификата (CSR)):openssl x509 -req -days 9999 -in server.csr -signkey server.key -out server.crt
Эта команда создаст файл сертификата
server.crt
. -
Создаем самоподписанный сертификат без файла запроса сертификата (CSR):
openssl req -new -x509 -days 9999 -nodes -out server.crt -keyout server.key
Эта команда создаст два файла, приватный ключ сервера
server.key
, и файл сертификатаserver.crt
.Она же в неинтерактивном режиме:
openssl req -new -x509 -days 9999 -nodes -subj "/C=RU/ST=Moscow/L=Moscow/O=Ruware/OU=IT Department/CN=ruware.com" -out server.crt -keyout server.key
Здесь в опции
--subj
указана вся необходимая для сертификата информация.
- Регистрируемся на сервисе startssl.com и заполняем анкету. Ждем, пока наши данные проверят
- @todo: дописать
Ссылки:
-
Извлекаем репозиторий:
sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
-
Устанавливаем все необходимые пакеты:
letsencrypt-auto —os-packages-only
-
Добавить в конфиг виртуальных хостов, для которых получаем сертификат, проксирование от виртуального хоста к letsencrypt:
location ~ ^/(.well-known/acme-challenge/.*)$ { proxy_pass http://127.0.0.1:29001/$1; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
-
Запустим клиент как
standalone
веб-сервер:./letsencrypt-auto \ --dry-run \ --no-self-upgrade \ --email [email protected] \ --agree-tos \ --text \ --non-interactive \ --keep-until-expiring \ --expand \ --standalone \ --standalone-supported-challenges http-01 \ --http-01-port 29001 \ certonly \ -d example.com \ -d www.example.com
Данная команда сэмулирует реальное получение серфтификата (опция
--dry-run
) - все необходимые для получения сертификата шаги будут пройдены, но сертификат не будет скачан. Чтобы скачать его, нужно убрать опцию--dry-run
. -
Полученные сертификаты по умолчанию будут скачаны в папку
/etc/letsencrypt/live/example.com
. Пропишите соответствующие сертификаты в настройки виртуальных хостов (в данном примере используется веб-сервер nginx):ssl on; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
Не забудьте перезагрузить веб-сервер. Подробнее см. Where are my certificates?
-
Пропишите команду обновления сертификатов в cron:
# todo
NB! Имейте ввиду, что для того, чтобы использовать разные SSL-сертификаты на разные домены, которые хостятся на одном физическом сервере с одним IP, необходимо корректно настроить виртуальный хост по умолчанию (/etc/nginx/sites-available/default
) - т.е. также получить для него корректный подписанный сертификат. Это нужно для того, что прежде чем передать виртуальный хост, сначала устанавливается SSL-соединение, и Nginx берет для него настройки из дефолтного виртуального хоста.
При желании все опции можно задать в конфигурационном файле: letsencrypt-auto --config cli.ini
Ссылки:
- Let`s Encrypt Documentation
- Full Documentation
- nginx + Let’s Encrypt
- Yet another инструкция по получению ssl-сертификата Let's Encrypt
certbot будет работать в режиме webroot, т.к. 80 и 443 порты уже заняты nginx и standalone-режим использовать нельзя. Поэтому требуется сначала загрузить в nginx конфиг виртуального хоста, работающий хотя бы по 80 порту, т.к. если используется модуль webroot, то certbot всегда будет работать на 80 порту).
Общая последовательность действий следующая:
- залить в nginx конфиг нового виртуального хоста, перезагрузить nginx
- запросить сертификат и получить его
- вписать в конфиг виртуального хоста в nginx полученный сертификат, перезагрузить nginx
Сервис, продлевающий сертификаты, может работать параллельно, никаких изменений в конфигах nginx он не требует, только перечитывания конфигурации самого nginx после обновления какого-либо сертификата.
Распишем подробнее последовательность действий.
Создайте конфигурацию виртуального хоста, какой ее хотите, только имейте в виду, чтобы работало получение сертификатов через certbot и его модуль webroot, нужно добавить в конфигурацию виртуального хоста соответствующий location (на 80 порт):
# For Certbot (Official EFF ACME client for Let's Encrypt)
location /.well-known/acme-challenge {
satisfy any;
auth_basic off;
allow all;
root /webroot;
}
Сначала получим сертификаты:
sudo docker run -it --rm --name certbot \
-v "/data/certbot/etc:/etc/letsencrypt:rw" \
-v "/data/certbot/lib:/var/lib/letsencrypt:rw" \
-v "/data/certbot/log:/var/log/letsencrypt:rw" \
-v "/data/certbot/webroot:/letsencrypt-webroot:rw" \
certbot/certbot certonly --no-self-upgrade --agree-tos --text --non-interactive --keep-until-expiring \
--expand --webroot --email [email protected] -w /letsencrypt-webroot -d example.com
Не забудьте подменить домен example.com
на свой, а также прокинуть свои папки и указать свою почту.
После этого можно скопировать конфигурацию хоста на сервер и перечитать конфиги nginx:
sudo docker exec <nginx-container-id> nginx -s reload
Также можно сначала протестировать конфигурацию на наличие ошибок:
sudo docker exec <nginx-container-id> nginx -t
В общем-то в заголовке все указано, необходимо вписать полученный сертификат в конфигурацию виртуального хоста и перезагрузить (перечитать конфигурацию) nginx.
sudo docker run -it --rm --name certbot \
-v "/data/certbot/etc:/etc/letsencrypt:rw" \
-v "/data/certbot/lib:/var/lib/letsencrypt:rw" \
-v "/data/certbot/log:/var/log/letsencrypt:rw" \
-v "/data/certbot/webroot:/letsencrypt-webroot:rw" \
certbot/certbot renew --no-self-upgrade --agree-tos --text --non-interactive \
--keep-until-expiring --expand --email [email protected] --dry-run
Не забудьте прокидывать свои директории и указывать свою почту.
export DOMAIN=example.com && \
sudo docker run -it --rm --name certbot \
-v "infrastructure_certbot-etc:/etc/letsencrypt:rw" \
-v "infrastructure_certbot-lib:/var/lib/letsencrypt:rw" \
-v "infrastructure_certbot-log:/var/log/letsencrypt:rw" \
-v "infrastructure_certbot-webroot:/webroot:rw" \
certbot/certbot revoke --no-self-upgrade --agree-tos --text --non-interactive --keep-until-expiring --expand \
--webroot -w /webroot -d $DOMAIN --cert-path /etc/letsencrypt/live/$DOMAIN/cert.pem
Не забудьте прокидывать свои директории и указывать свою почту.
Мы уже делали это в самом начале этого раздела, см. пункт Получение сертификата с помощью certbot
Смотри также How to stop renewing a letsencrypt/certbot certificate?
Центры сертификации - организации, принимающие запросы на сертификаты, и выпускающие их, подписанные своим ключем.
Три стороны: Центр сертификации, сертифицированный ресурс (сайт), клиент-посетитель сайта (браузер).
Последовательность действий верхнего уровня:
- Генерим приватный ключ для CA
- Генерим на основе приватного ключа CA открытый генерим пару сертификатов для домена, подписанных созданным на прошлом шаге CA.
Ссылки: