【发布时间】:2018-12-18 20:13:56
【问题描述】:
仍然对 ASN1 有点困惑。我正在使用 ruby openssl 解析 RFC3161 时间戳响应,所以我知道规范。我很确定结构已正确加载,但我对如何找到我想要的部件/键感到困惑。我知道有序列(有序)和集合(无序/唯一)。
我知道我们可以调用 asn1_object.value[0].value[0],但这很笨拙,我希望如果我知道键或标题,我可以将其视为 JSON 或 YAML,然后调用 asn1_object['TSTInfo']['serialNumber']。 这样不行吗?
我们是否应该使用预期有序的序列属性并且已经知道它们的位置,因为我们也有规范和长度?这对我来说很奇怪,但也许那是因为我以前没有使用过很多 TLV 格式。不幸的是,openssl 的文档很少,只是如何使用OpenSSL::ASN1.decode(der) 加载对象并通过索引访问值。还有traverse 方法,但这不会产生标题名称或我认为在这种情况下使用的任何东西。
#<OpenSSL::ASN1::Sequence:0x000055fdee1a2c68
@indefinite_length=false,
@tag=16,
@tag_class=:UNIVERSAL,
@tagging=nil,
@value=
[#<OpenSSL::ASN1::ObjectId:0x000055fdee1a2ec0
@indefinite_length=false,
@tag=6,
@tag_class=:UNIVERSAL,
@tagging=nil,
@value="1.2.840.113549.1.9.52">,
#<OpenSSL::ASN1::Set:0x000055fdee1a2c90
@indefinite_length=false,
@tag=17,
@tag_class=:UNIVERSAL,
@tagging=nil,
@value=
[#<OpenSSL::ASN1::Sequence:0x000055fdee1a2cb8
@indefinite_length=false,
@tag=16,
@tag_class=:UNIVERSAL,
@tagging=nil,
@value=
[#<OpenSSL::ASN1::Sequence:0x000055fdee1a2da8
@indefinite_length=false,
@tag=16,
@tag_class=:UNIVERSAL,
@tagging=nil,
@value=
@value=
[#<OpenSSL::ASN1::ObjectId:0x000055fdee1a3190
@indefinite_length=false,
@tag=6,
@tag_class=:UNIVERSAL,
@tagging=nil,
@value="signingTime">,
#<OpenSSL::ASN1::Set:0x000055fdee1a30f0
@indefinite_length=false,
@tag=17,
@tag_class=:UNIVERSAL,
@tagging=nil,
@value=
[#<OpenSSL::ASN1::UTCTime:0x000055fdee1a3118
@indefinite_length=false,
@tag=23,
@tag_class=:UNIVERSAL,
@tagging=nil,
@value=2018-12-19 01:49:08 UTC>]>]>
【问题讨论】:
-
你能告诉我们定义
ans1_object的代码吗? -
@SaraTibbetts 我从here使用
asn1 = OpenSSL::ASN1.decode(der) -
我认为主要问题是它们是否应该像 JSON/YAML 那样被访问(可能不是)。如果没有,我不熟悉在 ASN1 结构中找到所需内容的最佳方法。
标签: ruby serialization openssl tlv asn.1