Генерация CSR с расширением subjectAltName

В настоящее время я использую следующий код для генерации 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,

1

Решение

Я возился с этим с самого начала и не могу найти элегантного решения, но я нашел способ, который может помочь вам. Как вы, вероятно, знаете, вы можете указать альтернативные имена в конфигурационном файле 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.

2

Другие решения

Других решений пока нет …