- Введение:
- 1 Подготовка CA
- 2. Создание клиентского закрытого ключа и запроса на сертификат (CSR)
- 3. Подпись запроса на сертификат (CSR) с помощью доверенного сертификата (CA).
- 4. Создание сертификата в формате PKCS#12 для браузера клиента
- Forward secrecy
- Для чего я это пишу?
- Использованное по
- Как установить ssl-сертификат на nginx
- Конфиг nginx
- Настройка nginx
- Про cdn-сервисы
- Пройдемся по параметрам
- Сертификат
- Шаг 1. создание собственного самоподписанного доверенного сертификата.
- Шаг 2. сертификат сервера
Введение:
Потребовалось мне тут как-то написать небольшой API, в котором необходимо было помимо обычных запросов принимать запросы с «высокой степенью секретности».
Не я первый с этим столкнулся и мир давно уже использует для таких вещей
Поскольку на моём сервере используется nginx, то был установлен модуль SSLГугл не выдал ни одного работоспособного howto, но информация в сети есть по частям.
Итак, пошаговое руководство по настройке nginx на авторизацию клиентов через SSL-сертификаты.
Внимание! В статье для примера используются самоподписанные сертификаты!
Перед стартом создадим папку в конфиге nginx, где будут плоды наших трудов:
cd /path/to/nginx/config/
mkdir ssl && cd ssl1 Подготовка CA
Создадим конфигnano ca.config
со следующим содержимым:
[ ca ]
default_ca = CA_CLIENT # При подписи сертификатов # использовать секцию CA_CLIENT
[ CA_CLIENT ]
dir = ./db # Каталог для служебных файлов
certs = $dir/certs # Каталог для сертификатов
new_certs_dir = $dir/newcerts # Каталог для новых сертификатов
database = $dir/index.txt # Файл с базой данных подписанных сертификатов
serial = $dir/serial # Файл содержащий серийный номер сертификата (в шестнадцатеричном формате)
certificate = ./ca.crt # Файл сертификата CA
private_key = ./ca.key # Файл закрытого ключа CA
default_days = 365 # Срок действия подписываемого сертификата
default_crl_days = 7 # Срок действия CRL
default_md = md5 # Алгоритм подписи
policy = policy_anything # Название секции с описанием политики в отношении данных сертификата
[ policy_anything ]
countryName = optional # Поля optional - не обязательны, supplied - обязательны
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = optional
emailAddress = optionalДалее надо подготовить структуру каталогов и файлов, соответствующую описанной в конфигурационном файле
2. Создание клиентского закрытого ключа и запроса на сертификат (CSR)
Для создания подписанного клиентского сертификата предварительно необходимо создать запрос на сертификат, для его последующей подписи. Аргументы команды полностью аналогичны аргументам использовавшимся при создании самоподписанного доверенного сертификата, но отсутствует параметр -x509.
3. Подпись запроса на сертификат (CSR) с помощью доверенного сертификата (CA).
При подписи запроса используются параметры заданные в файле ca.config
openssl ca -config ca.config -in client01.csr -out client01.crt -batchВ результате выполнения команды появится файл клиентского сертификата client01.crt.
Для создания следующих сертификатов нужно повторять эти два шага.
4. Создание сертификата в формате PKCS#12 для браузера клиента
Это на тот случай, если к вашему серверу подключаются не бездушные машины, как в моём случае, а живые люди через браузер.
Запароленный файл PKCS#12 надо скормить браузеру, чтобы он смог посещать ваш сайт.
openssl pkcs12 -export -in client01.crt -inkey client01.key -certfile ca.crt -out client01.p12 -passout pass:q1w2e3Forward secrecy
Для включения Forward Secrecy можно использовать например такой набор шифров:
ssl_ciphers "EECDH ECDSA AESGCM EECDH aRSA AESGCM EECDH ECDSA SHA384 EECDH ECDSA SHA256 EECDH aRSA SHA384 EECDH aRSA SHA256 EECDH aRSA RC4 EECDH EDH aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";Кроме того, необходимо настроить приоритет шифров OpenSSL:
openssl ciphers -V 'EECDH ECDSA AESGCM EECDH aRSA AESGCM EECDH ECDSA SHA256 EECDH aRSA SHA256 EECDH aRSA RC4 EDH aRSA EECDH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS'В данном варианте не запрещается использование RC4 для сохранения совместимости с некоторыми браузерами, однако не так давно
, хоть и практически трудно реализуемые.
Для усиления шифрования можно увеличить стойкость DH-шифров, создав файл параметров DH-шифров (создание файла займет некоторое время!), скажем длинной 4096 бит:
openssl dhparam -out dh4096.pem 4096И добавив в конфиг nginx директиву
ssl_dhparam dh4096.pem;Это можно делать для скажем для веб-интерфейсов управления сервером/службами, однако хендшейк будет происходить еще дольше, поэтому не стоит делать это на обычном сайте.
Для чего я это пишу?
В последнее время в связи с кучей факторов (АНБ,
Использованное по
Ubuntu Server 10.10 (Linux 2.6.35-22-server #35-Ubuntu SMP x86_64 GNU/Linux)
nginx 0.9.3
OpenSSL 0.9.8o 01 Jun 2021
Как установить ssl-сертификат на nginx
После активации сертификата вам будут доступны необходимые данные для его установки, подробнее в статье Где взять данные для установки SSL-сертификата.
Также вы можете использовать для установки сертификат, купленный в сторонней компании.
Рассмотрим, как выполняется установка и настройка Nginx SSL:
- 1.
- 2.
Создайте файл your_domain.key и скопируйте в него содержание приватного ключа сертификата.
- 3.
Загрузите созданные файлы your_domain.crt и your_domain.key на сервер в директорию /etc/ssl/. Директория может быть иной, например /etc/nginx/ssl/your_domain.com.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
Сохраните и закройте конфигурационный файл Nginx.
- 11.
- 12.
Готово, вы установили SSL-сертификат на Nginx.
Конфиг nginx
listen *:443;
ssl on;
ssl_certificate /path/to/nginx/ssl/server.crt;
ssl_certificate_key /path/to/nginx/ssl/server.nopass.key;
ssl_client_certificate /path/to/nginx/ssl/ca.crt;
ssl_verify_client on;
keepalive_timeout 70;
fastcgi_param SSL_VERIFIED $ssl_client_verify;
fastcgi_param SSL_CLIENT_SERIAL $ssl_client_serial;
fastcgi_param SSL_CLIENT_CERT $ssl_client_cert;
fastcgi_param SSL_DN $ssl_client_s_dn;Настройка nginx
В результате настройки у меня сформировался приблизительно такой конфиг, суть параметров поясню ниже.
Про cdn-сервисы
В обсуждении
Forward Secrecy было замечено, что по крайней мере CDN Amazon CloudFront не поддерживает обмен с вашим сервером в DH-кодировках, да и RC4 вроде тоже, что не радует. Возможно что и с другими CDN тоже не все идеально, но я лично пока с ними не сталкивался, поэтому ничего сказать не могу.
Пройдемся по параметрам
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;
«Задаёт тип и размеры кэшей для хранения параметров сессий.» (my-sertif.ru) Кеш необходим для возможности повторного использования ключей сессии, таким образом при установлении нового соединения будут использоваться старые ключи, т.е. не будет повторно производиться хендшейк.
Особенно актуально при использовании кодировки DHE (например в бразуере Opera 12), поскольку время загрузки страницы со всеми элементами сильно увеличивается при отсутствии кеша, а DHE еще и использует больше ресурсов и времени (относительно EECDH и RC4).
ssl_prefer_server_ciphers on;«Указывает, чтобы при использовании протоколов SSLv3 и TLS серверные шифры были более приоритетны, чем клиентские.» (my-sertif.ru) — клиентские шифры (CBC) уязвимы к некоторым типам атак.
ssl_stapling on;Позволяет серверу прикреплять OCSP-ответы, тем самым уменьшая время загрузки страниц у пользователей. ЗДесь имеются ввиду ответы о валидности сертификата (при проверке на отозванность). С точки зрения безопасности пользователя не важно, кто передает ответы — веб-сервер или сервер CA — ведь ответ в любом случае подписан и валидность ответа тоже можно проверить, а ответ включает в себя свой срок действия.Для работы этой функции нужно указать DNS-сервер, что и делается директивой resolver.
keepalive_timeout — думаю в описании не нуждается, не стоит выключать или ставить слишком малым для уменьшения нагрузки из-за повторного установления соединения.
Сертификат
У меня уже был сертификат от StartSSL. О нем уже
на хабре, так что на этом шаге задерживаться не буду. Скажу только, что в течении первых двух-трех дней браузеры, проверяющие сертификат на сервере, могут на него ругаться (у меня такое происходило с Opera 12 и Firefox), видимо у StartCom кеши валидных сертификатов обновляются не так часто. Про установку же будет сказано ниже
Шаг 1. создание собственного самоподписанного доверенного сертификата.
Собственный доверенный сертификат (Certificate Authority или CA) необходим для подписи клиентских сертификатов и для их проверки при авторизации клиента веб-сервером.С помощью приведенной ниже команды создается закрытый ключ и самоподписанный сертификат.
Шаг 2. сертификат сервера
Создадим сертификат для nginx и запрос для него
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csrПодпишем сертификат нашей же собственной подписью
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crtЧтобы nginx при перезагрузке не спрашивал пароль, сделаем для него беспарольную копию сертификата
openssl rsa -in server.key -out server.nopass.key