我正在使用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/

10-11 09:18