SSL - andyceo/documentation GitHub Wiki

Сертификат - это метод распространения открытого ключа и другой информации о сервере и организации, ответственной за него. Сертификат может иметь цифровую подпись, которая сделана центром сертификации (CA).

Для того, чтобы использовать сертификат, как правило, надо осуществить следующие действия:

  1. Сгенерировать открытый и закрытый ключи сервера
  2. Создать запрос на сертификат: CSR (включающий открытый ключ, информацию о сервере, и управляющей им компании). Запрос представляет собой текстовый файл, содержащий в закодированном виде информацию об администраторе домена и открытый ключ.
  3. Отправить файл запроса центру сертификации (CA), вместе с подтверждающими документами
  4. Центр проверяет запрос на сертификат и вашу идентичность, и затем отсылает в ответ сертификат для вашего сервера
  5. Установить полученный сертификат на сервер и настроить нужные приложения на его использование

Ссылки:

Создание запроса на подпись сертификата (CSR)

Этот раздел описывают все действия, необходимые, чтобы сгенерировать открытый и закрытый ключи сервера, и создать запрос на сертификат (включающий открытый ключ, информацию о сервере, и управляющей им компании) (пункты 1. и 2.) Для создания самоподписанного сертификата, можно сразу перейти к разделу Создание самоподписанного сертификата.

Также, вместо используемых в инструкции имен ключей server.key.strong и server.key, лучше использовать имена, созданные на основе имени хоста, например, myhostname.key. Узнать имя хоста можно командой hostname.

  1. Сгенерируем запароленный безопасный приватный ключ сервера server.key.strong:

     openssl genrsa -des3 -out server.key.strong 2048
    

    Здесь надо обязательно ввести свою кодовую фразу на этот ключ. Этот ключ будет зашифрован этой кодовой фразой. Минимальная длина пароля - 4 символа, лучше 20. Этот ключ в следующем шаге будет использован для генерации другого ключа, без кодовой фразы, который будет использован для создания CSR, и этот второй ключ без кодовой фразы будет использован приложениями, работающими с SSL.

  2. Теперь, на основе безопасного ключа server.key.strong, создадим небезопасный ключ server.key, без кодовой фразы:

     openssl rsa -in server.key.strong -out server.key
    

    Будет запрошен пароль от ключа server.key.strong.

  3. Используя небезопасный ключ без пароля 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 указана вся необходимая для сертификата информация.

Получение бесплатного сертификата 1-го класса (Class 1) на startssl.com

  1. Регистрируемся на сервисе startssl.com и заполняем анкету. Ждем, пока наши данные проверят
  2. @todo: дописать

Ссылки:

Получение бесплатного сертификата с помощью letsencrypt.org

  1. Извлекаем репозиторий:

     sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
    
  2. Устанавливаем все необходимые пакеты:

     letsencrypt-auto —os-packages-only
    
  3. Добавить в конфиг виртуальных хостов, для которых получаем сертификат, проксирование от виртуального хоста к 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;
    }
    
  4. Запустим клиент как 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.

  5. Полученные сертификаты по умолчанию будут скачаны в папку /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?

  6. Пропишите команду обновления сертификатов в cron:

     # todo
    

NB! Имейте ввиду, что для того, чтобы использовать разные SSL-сертификаты на разные домены, которые хостятся на одном физическом сервере с одним IP, необходимо корректно настроить виртуальный хост по умолчанию (/etc/nginx/sites-available/default) - т.е. также получить для него корректный подписанный сертификат. Это нужно для того, что прежде чем передать виртуальный хост, сначала устанавливается SSL-соединение, и Nginx берет для него настройки из дефолтного виртуального хоста.

При желании все опции можно задать в конфигурационном файле: letsencrypt-auto --config cli.ini

Ссылки:

Получение и обновление сертификатов LetsEncrypt (nginx + certbot + docker swarm)

certbot будет работать в режиме webroot, т.к. 80 и 443 порты уже заняты nginx и standalone-режим использовать нельзя. Поэтому требуется сначала загрузить в nginx конфиг виртуального хоста, работающий хотя бы по 80 порту, т.к. если используется модуль webroot, то certbot всегда будет работать на 80 порту).

Общая последовательность действий следующая:

  • залить в nginx конфиг нового виртуального хоста, перезагрузить 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;
}

Получение сертификата с помощью certbot

Сначала получим сертификаты:

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

В общем-то в заголовке все указано, необходимо вписать полученный сертификат в конфигурацию виртуального хоста и перезагрузить (перечитать конфигурацию) nginx.

Дальнейшая работа с certbot и сертификатами Lets Encrypt

Автоматическое продление всех сертификатов (симуляция, уберите --dry-run для реального обновления)

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

Не забудьте прокидывать свои директории и указывать свою почту.

Отзыв сертификата для домена example.com

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

Не забудьте прокидывать свои директории и указывать свою почту.

Получение нового сертификата для домена example.com

Мы уже делали это в самом начале этого раздела, см. пункт Получение сертификата с помощью certbot

Смотри также How to stop renewing a letsencrypt/certbot certificate?

Создание собственного Центра сертификации (CA) и генерация сертификатов, подписанных своим центром

Общая информация

Центры сертификации - организации, принимающие запросы на сертификаты, и выпускающие их, подписанные своим ключем.

Три стороны: Центр сертификации, сертифицированный ресурс (сайт), клиент-посетитель сайта (браузер).

Последовательность действий верхнего уровня:

  1. Генерим приватный ключ для CA
  2. Генерим на основе приватного ключа CA открытый генерим пару сертификатов для домена, подписанных созданным на прошлом шаге CA.

Ссылки:

Полезные ссылки

⚠️ **GitHub.com Fallback** ⚠️