我正在使用GnuTLS 3.4.1。我有一个内部带有序列集的x509证书。证书以这种方式存储在智能卡上。
GnuTLS正在通过功能_asn1_ordering_set_of
重新排列序列,这似乎导致验证失败。
序列如下所示:
SEQUENCE :
...
SET :
SEQUENCE :
OBJECT_IDENTIFIER : 'CN (2.5.4.3)'
PrintableString : '0000'
SEQUENCE :
OBJECT_IDENTIFIER : 'SN (2.5.4.4)'
TeletexString : 'XXX'
SEQUENCE :
OBJECT_IDENTIFIER : 'G (2.5.4.42)'
TeletexString : 'YYY'
OpenSSL(可能还有Java PKCS11提供程序)按原样加载此构造。
证书加载时的GnuTLS在
_asn1_ordering_set_of
中对该构造进行排序。这样就变成:SEQUENCE :
...
SET :
SEQUENCE :
OBJECT_IDENTIFIER : 'G (2.5.4.42)'
TeletexString : 'YYY'
SEQUENCE :
OBJECT_IDENTIFIER : 'SN (2.5.4.4)'
TeletexString : 'XXX'
SEQUENCE :
OBJECT_IDENTIFIER : 'CN (2.5.4.3)'
PrintableString : '0000'
为什么GnuTLS对序列集进行排序?应该采取什么方式,是GnuTLS错误还是其他图书馆只是忽略了订购?
最佳答案
RFC5280具有:
4.1。基本证书字段
X.509 v3证书的基本语法如下。签名
计算中,将使用ASN.1对要签名的数据进行编码
专有编码规则(DER)[X.690]。
所以在我看来,GnuTLS做的正确。
看起来它也正在尝试对专有名称进行编码,但是这样做是错误的。根据ASN1,它是有效的,因为该规范确实很奇怪。每个零件可以有多个值。但是您希望CN,SN等各自位于自己的SET中,因此所有这些SEQUENCE都应具有自己的SET。
关于ssl - 通过_asn1_ordering_set_of重新排序导致签名验证失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30193511/