【问题标题】:Generate CSR with subjectAltName extension生成带有 subjectAltName 扩展名的 CSR
【发布时间】:2016-03-23 05:58:22
【问题描述】:

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

【问题讨论】:

标签: php openssl csr


【解决方案1】:

自从投票以来我一直在搞砸这个问题并且找不到一个优雅的解决方案,但我确实找到了一个可能对你有用的解决方法。您可能知道,您可以在 openssl 配置文件中指定替代名称。你也可以在configArgsopenssl_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的限制。

【讨论】:

  • 哦,你还得删除你现有代码中的subjectAltName数组条目,它不会被使用,它所做的只是把你的主题行弄乱了。
  • 你需要一个最小的配置文件,它现在在这里实现:github.com/kelunik/acme/commit/…
猜你喜欢
  • 2022-07-18
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 2019-08-25
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多