公司给我的智能手机发了一个证书。文件名为“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]”的任何其他扩展也可以被复制。