Шпаргалка для создания собственного CA и выпуска сертификатов для серверов и клиентов (email-адресов)
Для создания собственно CA необходимо для начала создать правильную структуру каталогов и иметь правильно настроенный файл openssl.cnf с конфигурацией для openssl.
mkdir certs crl csr newcerts private
chmod 700 private
touch index.txt
echo 1000 > serial
Вначале нужно создать секретный ключ CA. Для этого нужно выполнить команду, которая создаст
секретный ключ CA длиной 4096 бит и поместил его в текстовый файл private/ca.key.pem
в
кодировке PEM. Секретный ключ CA желательно зашифровать и защитить паролем, для этого в
команде нужно указать ключ -aes256
. Ключ и сертификат для CA обычно создаются на длительное
время, например, на 10 лет, поэтому лучше использовать более длинный ключ, например, в 4096
бит.
openssl genrsa -out private/ca.key.pem 4096
После этого необходимо выпустить самоподписанный сертификат для созданного ключа.
openssl req -config openssl.cnf -key private/ca.key.pem -new -x509 -days 7300 -sha256 -extensions v3_ca -out certs/ca.cert.pem
Тут, через ключи:
-config
явно указывает файл конфигурации для openssl, который будет использоваться.-key
указывает путь к файлу с секретным ключом CA.-days
указывает время жизни сертификата в днях (7300 = 20 лет).-sha256
указывает алгоритм подсчета контрольной суммы для ЭЦП.-extensions v3_ca
указывает секцию расширения конфигурации указанную в файлеopenssl.cnf
.-out certs/ca.cert.pem
указывает файл в кодировке PEM, в который нужно записать созданный сертификат.
Созданный сертификат можно посмотреть командой
openssl x509 -noout -text -in certs/ca.cert.pem
После этого можно подписывать сертификаты серверов и клиентов (email-сертификаты).
Чтобы браузеры и почтовые клиенты не ругались на неизвестный сертификат CA его нужно добавить в браузеры и/или хранилище ОС. Например, для Chrome нужно перейти в Настройки сертификатов (chrome://settings/certificates) и добавить сертификат CA в Центры сертификации с указанием нужного уровня доверия.
Для создания сертификата сервера, нужно вначале создать его секретный ключ.
Тут для примера создается ключ длиной 2048 (ключ и сертификат сервера обычно меняются каждый год,
т.ч. можно использовать меньшую длину ключа для снижения времени при работе с ключом) и помещается в
файл private/mail.localhost.key.pem
в кодировке PEM.
openssl genrsa -out private/mail.localhost.key.pem 2048
После этого можно создать запрос на выпуск сертификата для этого ключа.
При создании запроса обязательно нужно указать значение для расширения subjectAltName
, иначе
браузер может выдавать предупреждение о недействительном сертификате. В расширении можно указать
dns-имя хоста и/или его ip-адрес.
Например, для сервера с именем mail.localhost
и ip-адресом 127.0.0.1
команда будет
openssl req -config openssl.cnf -key private/mail.localhost.key.pem -new -sha256 -out csr/mail.localhost.csr.pem -addext "subjectAltName = DNS:mail.localhost, IP:127.0.0.1"
Посмотреть содержимое созданного запроса на сертификат можно командой
openssl req -noout -text -in csr/mail.localhost.csr.pem
После этого можно выпустить для созданного запроса сертификат сервера
openssl ca -config openssl.cnf -extensions server_cert -days 375 -notext -md sha256 -in csr/mail.localhost.csr.pem -out certs/mail.localhost.cert.pem