使用subjectAltName扩展生成CSR

时间:2015-12-16 22:19:06

标签: php openssl csr

我目前正在使用以下代码为其他域生成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等任何第三方库。

1 个答案:

答案 0 :(得分:2)

自从upvote以来我一直在搞乱这个并且无法找到一个优雅的解决方案,但我找到了一个可能对你有用的解决方法。您可能知道,您可以在openssl配置文件中指定alt名称。您还可以在configArgsopenssl_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函数中,但这可能是一个开放的限制。