我目前正在使用以下代码为其他域生成subjectAltName
的CSR。
$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
,其他任意值都会导致错误。但是如何使用OpenSSL在PHP中创建一个真正包含subjectAltName
请求扩展名的CSR?
此问题专门针对捆绑的openssl_*
功能,而不是phpseclib
等任何第三方库。
答案 0 :(得分:2)
自从upvote以来我一直在搞乱这个并且无法找到一个优雅的解决方案,但我找到了一个可能对你有用的解决方法。您可能知道,您可以在openssl配置文件中指定alt名称。您还可以在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部分设置为使用文件中的alt名称,例如
subjectAltName = @test_req
然后(重新)创建test_req部分,并用您的DNS名称填充它,例如
[ test_req ]
DNS.1 = foo.bar
DNS.2 = foo.baz
如果您需要更多信息,请与我们联系。也许其他人可以弄清楚如何将其直接插入到php函数中,但这可能是一个开放的限制。