Выдача сертификатов для Apache2 с Subject Alternative Name (SAN)

Имеется действующий центр сертификации на основе Windows Server Active Directory Certificate Services (AD CS). Задача: выдать сертификат для использования с Apache2 веб сервером, который будет корректно работать в браузерах Chrome и Edge (необходима SAN опция сертификата).

Шаг 0

На стороне веб сервера Apache2.

Определяемся где будут лежать файлы, сгенерированные в ходе инструкции, я использую директорию: /home/administrator/certs/webserver.domain.ru переходим в данную директорию.

Шаг 1

На стороне веб сервера Apache2.

Создаём конфигурационный файл webserver.domain.ru.cnf следующего содержания:

[ req ]
default_bits            = 2048
distinguished_name      = req_distinguished_name

string_mask = utf8only

req_extensions = v3_req # The extensions to add to a certificate request

[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
countryName_default             = AU
countryName_min                 = 2
countryName_max                 = 2

stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = Some-State

localityName                    = Locality Name (eg, city)

0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = Internet Widgits Pty Ltd

organizationalUnitName          = Organizational Unit Name (eg, section)
#organizationalUnitName_default =

commonName                      = Common Name (e.g. server FQDN or YOUR name)
commonName_max                  = 64

emailAddress                    = Email Address
emailAddress_max                = 64

[ req_attributes ]
challengePassword               = A challenge password
challengePassword_min           = 4
challengePassword_max           = 20

unstructuredName                = An optional company name

[ v3_req ]

# Extensions to add to a certificate request

basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = webserver.domain.ru

Здесь особое внимание нужно уделить параметрам:

req_extensions = v3_req — ссылка на нужную секцию.

keyUsage = nonRepudiation, digitalSignature, keyEncipherment — задаёт определённые возможности для сертификата, например ограниченный набор данных опций не даст возможность создавать сертификаты на его основе что логично в данном случае.

subjectAltName = @alt_names ссылка на секцию, где будем определять SAN для сертификата

[ alt_names ] DNS.1 = webserver.domain.ru — SAN запись, можно создавать множество DNS.2, DNS.3 и так далее.

webserver.domain.ru — FQDN имя веб сервера, к которому будут обращаться клиенты.

Шаг 2

На стороне веб сервера Apache2.

Создаём ключ и запрос на выдачу сертификата, используя конфигурационный файл openssl, сделанный в прошлом шаге.

openssl genrsa -out webserver.domain.ru.key 2048

openssl req -new -nodes -keyout webserver.domain.ru.key -out webserver.domain.ru.req -config webserver.domain.ru.cnf
# Необходимо ввести только: Common Name (e.g. server FQDN or YOUR name) []:webserver.domain.ru
# Остальное по необходимости.
# Если спросит пароль, то оставить его пустым.

Шаг 3

На стороне Certification Authority сервера.

Копируем в C:\Requests\ файл *.req, созданный в прошлом шаге, должно получится «C:\Requests\webserver.domain.ru.req«.

Запускаем командную строку от пользователя, имеющего права на выдачу сертификатов (Domain Admins например). Пробуем выпустить сертификат:

certreq -submit -attrib "CertificateTemplate:WebServer" "C:\Requests\webserver.domain.ru.req" "C:\Requests\webserver.domain.ru.cer"

Откроется окно для выбора центра сертификации, выбираем необходимый. Сертификат должен сгенерироваться, добавиться в хранилище, а забрать его можно в «C:\Requests\webserver.domain.ru.cer». Для проверки можно его открыть и убедиться что присутствует Subject Alternative Name.

Шаг 4

На стороне веб сервера Apache2.

Копируем webserver.domain.ru.cer из прошлого шага на веб сервер и конвертируем в pem:

openssl x509 -in webserver.domain.ru.cer -out webserver.domain.ru.pem

Определяемся, где будут лежать pem и key файлы для Apache2. Я использую /etc/ssl/certs/ и /etc/ssl/private/ (возможно не совсем правильно). Копируем получившиеся файлы туда:

cp webserver.domain.ru.pem /etc/ssl/certs/webserver.domain.ru.pem
cp webserver.domain.ru.key /etc/ssl/private/webserver.domain.ru.key

Шаг 5

На стороне веб сервера Apache2.

Открываем конфигурационный файл сайта, например /etc/apache2/sites-available/default-ssl.conf и указываем/меняем параметры:

SSLCertificateFile     /etc/ssl/certs/webserver.domain.ru.pem
SSLCertificateKeyFile  /etc/ssl/private/webserver.domain.ru.key

Перезапускаем веб сервер systemctl restart apache2

Пробуем открыть страницу в веб браузере и удостоверяемся, что соединение защищено (корневые сертификаты должны быть установлены в системе).

Firefox использует собственное хранилище сертификатов, можно через настройки добавить корневой сертификат, или использовать системное хранилище сертификатов:

about:config
security.enterprise_roots.enabled -> true

Что почитать

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Яндекс.Метрика