如何在 Linux 上打印/显示“p12”证书的“用户主体名称”或 UPN?

如何在 Linux 上打印/显示“p12”证书的“用户主体名称”或 UPN?

公司给我的智能手机发了一个证书。文件名为“3274634.p12”。文档中说“输入您的用户主体名称 (UPN) 作为登录名”,并描述了如何使用 Internet Explorer 获取此值。

我如何在 Linux(Kubuntu 13.04)上执行相同操作?

答案1

PKCS#12 文件通常包含 X.509 证书及其关联的私钥。所有信息都存储在证书中,因此您需要先将其提取出来:

openssl pkcs12 -in foo.p12 -out foo.pem

foo.pem将包含证书私钥。

UPN 以特殊类型的“subjectAltName”形式存储在证书中。遗憾的是,OpenSSL 尚不知道如何显示 UPN(以及其他类型的名称),因此用于检查证书的常用命令 ( openssl x509 -noout -text < foo.pem) 将不起作用。相反,您需要使用低级工具。

将证书分离到其自己的文件中(您也可以使用文本编辑器执行此操作):

openssl x509 < foo.pem > foo.cert

将证书打印为 ASN.1 结构:

openssl asn1parse -i -dump < foo.cert

找到描述 subjectAltName 扩展的行:

742:d=4  hl=3 l= 200 cons:     SEQUENCE          
745:d=5  hl=2 l=   3 prim:      OBJECT          :X509v3 Subject Alternative Name
750:d=5  hl=3 l= 192 prim:      OCTET STRING    [HEX DUMP]:3081BDA036...

然后再次运行asn1parse,这次告诉它深入挖掘扩展的内容(这是另一个 ASN.1 结构)——在此示例中,值(“OCTET STRING”行)从偏移量 750 开始:

openssl asn1parse -i -dump -strparse 750 < foo.cert

最后,在转储中查找 UPN:

59:d=1  hl=2 l=  40 cons:  cont [ 0 ]        
61:d=2  hl=2 l=  10 prim:   OBJECT          :Microsoft Universal Principal Name
73:d=2  hl=2 l=  26 cons:   cont [ 0 ]        
75:d=3  hl=2 l=  24 prim:    UTF8STRING      :[email protected]

如果您安装了 GnuTLS 工具,则有一种更快的方法,但不太可靠。提取证书后,您可以将其提供给certtool -i < foo.cert,它会打印原始内容,即使是它无法识别的名称:

Subject Alternative Name (not critical):
    otherName OID: 1.3.6.1.4.1.311.20.2.3
    otherName DER: 0c1867726177697479404e554c4c524f5554452e45552e4f5247
    otherName ASCII: [email protected]

查找 OID 1.3.6.1.4.1.311.20.2.3;它后面是名称的原始内容。幸运的是,它们由单个 UTF8String 组成,因此“otherName ASCII”输出很容易理解 - 只需删除前两个字节(此处显示为点)。


一种更简单的方法是尝试输入您自己的 Windows 登录信息;UPN 始终采用 的形式username@domain

(有点遗憾的是,在我尝试过的所有工具中,几乎没有一个知道如何解释这种简单且常用的(即使是专有的)名称类型。)

答案2

基于重力

如果您只想从另一个证书复制 SAN,则可以复制整个 ASN.1 SAN 子结构。

找到描述 subjectAltName 扩展的行:

742:d=4  hl=3 l= 200 cons:     SEQUENCE          
745:d=5  hl=2 l=   3 prim:      OBJECT          :X509v3 Subject Alternative Name
750:d=5  hl=3 l= 192 prim:      OCTET STRING    [HEX DUMP]:3081BDA036...

并将十六进制字符串粘贴到 openssl 配置中:

 [v3_extensions_section]
 subjectAltName = DER:3081BDA036...

我希望在 asn1parse 输出中显示为“[HEX DUMP]”的任何其他扩展也可以被复制。

相关内容