Для корректной работы многих сервисов в современном интернете требуется наличие сертификатов. В качестве примера можно привести HTTPS, SMTP поверх TLS, OpenVPN. В зависимости от сферы применения к сертификатам предъявляются разные требования:
Веб сервер с поддержкой SSL (HTTPS). Необходим серверный сертификат подписанный официальным удостоверяющим центром, сертификат которого есть в поставке популярных браузеров.
Почтовый сервер с поддержкой SSL (SMTP поверх TLS, POP3S, IMAPS). Для SMTP обычно достаточно самоподписанного серверного сертификата. Для POP3S, IMAPS желательно иметь официальный сертификат, поскольку почтовые клиенты (например Thunderbird) выдают предупреждения о неизвестных или некорректных сертификатах.
С OpenVPN поставляется собственный удостоверяющий центр, который позволяет создавать сертификаты сервера и клиента. Сертификат этого центра генерируется локально и добавляется в файл конфигурации клиента и сервера.
Проект LetsEncrypt направлен на массовое внедрение HTTPS в интернете. Он предоставляет бесплатный удостоверяющий центр и наборы скриптов (для разных ОС разные), которые автоматически генерируют пару ключей, создают запрос на выпуск сертификата, отправляют его в удостоверяющий центр LetsEncrypt, а затем автоматически добавляют полученный сертификат в настройки популярных веб-серверов (Apache,Nginx, IIS).
Для почтового сервера достаточно прописать путь к файлу сертификата LetsEncrypt и использовать его совместно с веб-сервером.
Вместе с OpenVPN поставляется набор скриптов easyrsa
(есть под Linux и Windows), которые вызывают openssl для выполнения основных манипуляций с сертификатами. В набор скриптов входят:
Версии с добавлением -pass потребуют ввода пароля для шифрования приватного ключа.
В файле openssl.cnf
хранятся различные параметры openssl. Многие из них ссылаются переменные окружения, поэтому реальные настройки находятся в файле vars.sh
(vars.bat
).
vars.sh (фрагмент)
export KEY_SIZE=1024
export CA_EXPIRE=3650
export KEY_EXPIRE=3650
# Атрибуты сертификата
# могут быть изменены в диалоговом режиме
# при создании сертификата
export KEY_COUNTRY="RU"
export KEY_PROVINCE="EKB"
export KEY_CITY="Ekaterinburg"
export KEY_ORG="IMM"
export KEY_EMAIL=""
Внутри скриптов EasyRSA находятся вызовы openssl. Следует помнить, что часть параметров, такие как тип и размер ключа, ключ CA и т.п. находятся в файлt openssl.cnf.
Создание ключа CA без сертификата
#запрос на сертификат сроком на 10 лет
openssl req -days 3650 -nodes -new -x509 -keyout ca.key -out ca.csr -config openssl.cnf
Создание пары ключ-сертификат клиента
#запрос на сертификат сроком на 10 лет
openssl req -days 3650 -nodes -new -keyout client.key -out client.csr -config openssl.cnf
#подпись сертификата ключом CA
openssl ca -days 3650 -out client.crt -in client.csr -config openssl.cnf
то же для сервера
#запрос на сертификат сроком на 10 лет
openssl req -days 3650 -nodes -new -keyout srv.key -out srv.csr -config openssl.cnf
#подпись сертификата ключом CA
openssl ca -days 3650 -extensions server -in srv.csr -out srv.crt -config openssl.cnf
Экспорт в формат PKCS#12
#запрос на сертификат сроком на 10 лет
openssl req -days 3650 -nodes -new -keyout client.key -out client.csr -config openssl.cnf
#подпись сертификата ключом CA
openssl ca -days 3650 -in client.csr -out client.crt -config openssl.cnf
# конвертация пары ключ/сертификат в файл pkcs#12.
openssl pkcs12 -export -inkeyclient.key -in client.crt -certfile ca.crt -out client.p12