如何仅使用 openssl 命令从 CSR 中提取主题备用名称



我需要从CSR中提取主题备用名称。除了在openssl req -in test中使用"-text"之外,有什么方法可以提取它.csr-text -noout?(也许与 -subject 参数类似?

我注意到SAN有时被格式化为"电子邮件",因此grep DNS实际上不能很好地工作。您是否可以推荐任何命令来正确获取SubjAltName?

我需要从 CSR 中提取主题备用名称...

如果您查看要<openssl dir>/apps/req.c的源代码,您会发现没有什么可以提取的,只有 SAN。但您可以执行以下操作:

openssl req -in test.csr -text -noout | grep DNS

下面是测试 CSR 上的输出:

$ openssl req -in example-com.req.pem -text -noout | grep DNS
  DNS:example.com, DNS:www.example.com, DNS:mail.example.com, DNS:ftp.example.com

它之所以有效,是因为公用名 (CN) 只是自由格式的文本。SAN 中的名称确实是 GeneralName ,它们有几种不同的类型:

 GeneralName ::= CHOICE {
    otherName                       [0]     OtherName,
    rfc822Name                      [1]     IA5String,
    dNSName                         [2]     IA5String,
    x400Address                     [3]     ORAddress,
    directoryName                   [4]     Name,
    ediPartyName                    [5]     EDIPartyName,
    uniformResourceIdentifier       [6]     IA5String,
    iPAddress                       [7]     OCTET STRING,
    registeredID                    [8]     OBJECT IDENTIFIER }

因此,您要查找的DNS前缀是OpenSSL的req在遇到dNSName时打印的内容。

对于每个偶然发现这个的人(像我一样),我找到了这样的方式:

openssl x509 -noout -text -in certificate.pem|grep -A1 'X509v3 Subject Alternative Name'|tail -n1

SAN 值位于(A1 grep 标志)行"X509v3..."之后的一行,尾部命令会剪切除最后一行(具有 SAN 值的行)之外的所有内容。

最新更新