在RFC 5280例如,X520OrganizationName
可以使用以下编码之一:
X520OrganizationName ::= CHOICE {
teletexString TeletexString
(SIZE (1..ub-organization-name)),
printableString PrintableString
(SIZE (1..ub-organization-name)),
universalString UniversalString
(SIZE (1..ub-organization-name)),
utf8String UTF8String
(SIZE (1..ub-organization-name)),
bmpString BMPString
(SIZE (1..ub-organization-name)) }
如何查找给定 X509 证书中使用的编码?是否有 openssl 命令或类似软件?
答案1
使用ASN.1 DER解码器软件:
OpenSSL:
openssl asn1parse -i -in Foo.crt
(asn1parse 需要 Base64 “PEM” 格式,大多数其他 openssl 子命令也是如此,但您可以使用
-inform DER
它来提供二进制格式的证书。)P.Gutmann的dumpasn1:
dumpasn1 Foo.der
openssl x509 -in Foo.crt -out Foo.der -outform DER
(dumpasn1 需要二进制(非 Base64)格式。使用或甚至使用将证书转换为二进制 DERbase64 -d
。)asn1.js (在线):https://lapo.it/asn1js/
(另一个类似的版本https://pkitools.net/pages/ca/asn1.html)
主题 DN 是证书中的第一个字段之一(前 后两个时间戳 – 发行者 DN 是后它是一种将 RDN 存储在时间戳之前的二进制文件(即,在时间戳之前);它表示为一个“序列”,其中每个 RDN 都是一个“集合”(通常有一个元素,但格式允许多个,例如CN=this+UID=that,OU=etc,O=etc
)。
例如:
$ openssl x509 -outform DER -in Telia_Root_CA_v2.pem -out /tmp/telia.crt $ dumpasn1 /tmp/telia.crt 0 1396:序列{ 4 860:序列{ 8 3: [0] { ← 版本(X.509 v3) 10 1:整数 2 :} ↙ 序列号 13 15:整数 01 67 5F 27 D6 FE 7A E3 E4 AC BE 09 5B 05 9E 30 13:序列{ ← 算法 32 9:对象标识符 sha256WithRSAEncryption (1 2 840 113549 1 1 11) 43 0:空 :} 45 68:序列{ ←主题发卡机构 DN 从此处开始 47 11:设置{ 49 9:序列{ 51 3:对象标识符 countryName (2 5 4 6) 56 2:可打印字符串 'FI' :} :} 60 26: 放 { ← 'O=...' RDN 62 24: 顺序 { ← RDN 的 'O=...' 元素 64 3: 对象标识符组织名称 (2 5 4 0) 69 17: UTF8String‘Telia Finland Oyj’ : } : } 88 25:设置{ 90 23:序列 { 92 3:对象标识符 commonName (2 5 4 3) 97 16:UTF8String‘Telia Root CA v2’ :} :} :} 115 30:序列 { 117 13:UTC时间 2018/11/29 11:55:54 GMT
答案2
使用 OpenSSL 的更具体且更易于阅读的方法:
openssl x509 {<file | -in file} -noout -subject -nameopt oneline,show_type
# change -subject to -issuer (or use both!) if applicable
# if DN is long or complex enough that single-line is hard to read
# change oneline to multiline
# for the cert currently used by www.example.com:
$ openssl x509 <temp -noout -subject # default does not show types
subject=C = US, ST = California, L = Los Angeles, O = Internet\C2\A0Corporation\C2\A0for\C2\A0Assigned\C2\A0Names\C2\A0and\C2\A0Numbers, CN = www.example.org
$ openssl x509 <temp -noout -subject -nameopt oneline,show_type
subject=C = PRINTABLESTRING:US, ST = PRINTABLESTRING:California, L = PRINTABLESTRING:Los Angeles, O = UTF8STRING:Internet\C2\A0Corporation\C2\A0for\C2\A0Assigned\C2\A0Names\C2\A0and\C2\A0Numbers, CN = PRINTABLESTRING:www.example.org
$ openssl x509 <temp -noout -subject -nameopt multiline,show_type
subject=
countryName = PRINTABLESTRING:US
stateOrProvinceName = PRINTABLESTRING:California
localityName = PRINTABLESTRING:Los Angeles
organizationName = UTF8STRING:Internet\A0Corporation\A0for\A0Assigned\A0Names\A0and\A0Numbers
commonName = PRINTABLESTRING:www.example.org
$
在旧版本的 OpenSSL 中,默认格式为 PEM,如果适用,您必须指定-inform DER
(或缩写)。然而在 3.0.0 以上版本中,这是目前唯一受上游支持的版本,-inform d
最多命令包括x509
自动接受 PEM 或 DER 输入。(asn1parse
不是,因为与其他命令不同,它不查看甚至不需要 PEM 标签行;它的“PEM”格式实际上接受任何base64,除非您指定新选项-strictpem
。有时这很有用,有时则没有。)