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

Aar*_*lla 5 linux certificate

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

我如何在 Linux (Kubuntu 13.04) 上做同样的事情?

use*_*686 9

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

openssl pkcs12 -in foo.p12 -out foo.pem
Run Code Online (Sandbox Code Playgroud)

foo.pem将包含证书私钥。)

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

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

openssl x509 < foo.pem > foo.cert
Run Code Online (Sandbox Code Playgroud)

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

openssl asn1parse -i -dump < foo.cert
Run Code Online (Sandbox Code Playgroud)

找到描述 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...
Run Code Online (Sandbox Code Playgroud)

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

openssl asn1parse -i -dump -strparse 750 < foo.cert
Run Code Online (Sandbox Code Playgroud)

最后,在转储中查找 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      :grawity@NULLROUTE.EU.ORG
Run Code Online (Sandbox Code Playgroud)

如果您安装了 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: ..grawity@NULLROUTE.EU.ORG
Run Code Online (Sandbox Code Playgroud)

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


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

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