В настоящее время я использую следующий код для генерации CSR с subjectAltName
для дополнительных доменов.
$domains = ["example.com", "www.example.com"];
$san = implode(",", array_map(function ($dns) {
return "DNS:" . $dns;
}, $domains));
$csr = openssl_csr_new([
"CN" => reset($domains),
"ST" => "Germany",
"C" => "DE",
"O" => "Unknown",
"subjectAltName" => $san,
], $privateKey, [
"digest_alg" => "sha256",
"req_extensions" => "v3_req",
]);
Но когда я использую openssl req -text -noout -verify -in csr.pem
чтобы проверить сгенерированный CSR, subjectAltName
не указан под Requested Extensions
раздел. Вместо, subjectAltName
добавлен в тему.
subjectAltName
распознается в первом массиве, другие произвольные значения приводят к ошибке. Но как я могу создать CSR в PHP с OpenSSL, который действительно включает в себя subjectAltName
как запрашиваемое расширение?
Этот вопрос конкретно о комплекте openssl_*
функции, а не любая сторонняя библиотека, как phpseclib
,
Я возился с этим с самого начала и не могу найти элегантного решения, но я нашел способ, который может помочь вам. Как вы, вероятно, знаете, вы можете указать альтернативные имена в конфигурационном файле openssl. Вы также можете указать свой собственный файл конфигурации в configArgs
в openssl_csr_new
Комбинируя эти два, вы можете создать / изменить файл конфигурации openssl в доступном для записи каталоге во время выполнения, например / tmp /, и затем указать использовать его.
Соответствующий фрагмент кода в вашем вызове openssl_csr_new выглядит следующим образом:
"digest_alg" => "sha256",
"req_extensions" => "v3_req",
"config" => "/path/to/config/file" // <-- new line
В файле конфигурации вам нужно настроить раздел v3_req, чтобы использовать альтернативные имена, которые будут в файле, например,
subjectAltName = @test_req
Затем (заново) создайте раздел test_req и заполните его своими DNS-именами, например,
[ test_req ]
DNS.1 = foo.bar
DNS.2 = foo.baz
Если вам нужна дополнительная информация, дайте мне знать. Может быть, кто-то еще может понять, как вставить это в функцию php напрямую, но это может быть ограничением openssl.
Других решений пока нет …