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

6
我需要从CSR中提取主题备用名称。是否有其他方法可以提取它,而不是使用“-text”在“openssl req -in test.csr -text -noout”中?(也许类似于-subject参数?)
我注意到SAN有时被格式化为“电子邮件”,因此grep DNS实际上无法正常工作。您可以推荐任何命令以正确获取SubjAltName吗?
2个回答

6
我需要从CSR中提取主题备用名称(subject alternative name)... 如果您查看/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时打印的内容。

我注意到有时候SAN被格式化为"email",所以grep DNS实际上不能很好地工作。你能推荐一些适用于所有SAN的命令吗? - EdgyIT
@Mark - 如果您拥有一个在SAN中带有电子邮件地址的终端实体证书,那么它听起来更像是用户证书而不是服务器证书。此外,您可能想在超级用户上提问,因为它涉及使用命令的问题。那里才能找到专家。Stack Overflow是用于编程和开发问题和答案的。 - jww

0

对于所有(像我一样)遇到困难的人,我发现了这种方法:

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

SAN 值出现在“X509v3…”行之后一行,A1 grep 标志位的下一行。尾命令会截取除了最后一行(即带有 SAN 值的行)以外的所有内容。

这是证书,不是证书请求 :) ...即x509与req - Mee Heer
这也假设SAN列表只有一行。 - wfaulk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接