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

如何仅使用openssl命令从CSR中提取主题替代名称?,openssl,Openssl,我需要从CSR中提取主题备选名称。除了在openssl req-in test.csr-text-noout中使用“-text”之外,还有其他方法可以提取这个吗?(可能与-subject参数类似?) 我注意到,SAN有时被格式化为“电子邮件”,因此grep DNS实际上无法正常工作。您是否可以推荐任何可以正确获取SubjectName的命令 我需要从CSR中提取主题备选名称 如果查看/apps/req.c的源代码,您会发现没有什么可以提取的,只有SAN。但您可以执行以下操作: openssl r

我需要从CSR中提取主题备选名称。除了在openssl req-in test.csr-text-noout中使用“-text”之外,还有其他方法可以提取这个吗?(可能与-subject参数类似?)

我注意到,SAN有时被格式化为“电子邮件”,因此grep DNS实际上无法正常工作。您是否可以推荐任何可以正确获取SubjectName的命令

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

如果查看
/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 ::= 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 }
因此,当OpenSSL遇到一个
dNSName

时,您正在搜索的
DNS
前缀就是OpenSSL的
req
打印的前缀。对于每个偶然发现这个前缀的人(像我一样),我发现如下方法:

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

SAN值位于“X509v3…”行之后一行(A1 grep标志),tail命令会剪切除最后一行以外的所有行,即带有SAN值的行。

我注意到SAN有时被格式化为“电子邮件”,因此grep DNS实际上无法正常工作。是否有任何命令可以推荐用于所有SAN?@Mark-如果您在SAN中有一个带有电子邮件地址的最终实体证书,听起来您有用户证书而不是服务器证书。此外,您可能希望继续提问,因为它会询问有关使用命令的问题。在那里你可以找到专家。堆栈溢出用于编程和开发问题和答案;不是企业社会责任:)……即。x509 vs要求