Имеется действующий центр сертификации на основе 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
Что почитать
- https://support.dnsimple.com/articles/what-is-ssl-san/
- https://help.bizagi.com/bpm-suite/en/index.html?subjectaltname_support.htm
- https://blog.zencoffee.org/2013/04/creating-and-signing-an-ssl-cert-with-alternative-names/
- https://pc.ru/articles/razreshaem-firefox-ispolzovat-kornevye-sertifikaty-windows