如何获取 X509 主题字段中使用的编码类型?

如何获取 X509 主题字段中使用的编码类型?

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)格式。使用或甚至使用将证书转换为二进制 DER base64 -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。有时这很有用,有时则没有。)

相关内容