应该怎么做...
只要不需要 CER 或 DER,ITU 建议使用 BER 对 SET OF 进行编码。我能说的最好的,没有必要。有关 ITU 和 ASN.1 领域的更详细说明,请参见下文。
但是,GnuTLS 可能正在遵守一个创造需求的标准。在这种情况下,我不知道它是哪个标准。见库尔特的回答。
我查看了RFC 5280、PKIX Certificate 和 CRL Profile,但找不到限制。也许它在另一个 PKIX 文档中。
是 GnuTLS 错误还是其他库只是省略了排序?
我不相信它本身是 GnuTLS 中的错误。它只是图书馆做事的方式。以此为模,要求在 RFC 或其他标准中这样做。
另请注意,其他库不会省略排序。他们使用证书中显示属性的顺序,这是一个排序:)
(评论)问题是 GNUTLS 重新排列导致 SSL 身份验证失败
这对我来说听起来像是一个错误(模标准要求)。在这种情况下,错误是在将签名放在 TBS/证书上后重新排序 SET OF。
如果 GnuTLS正在构建 TBS/证书,则可以重新排序,直到将签名放在上面。
(注释)GnuTLS 是否根据 DER 规则将 SET OF 类型的元素以正确的顺序排列
在ASN.1 编码规则中,X.690、BER/CER/DER:
8.12 一组值的编码
......
8.12.3 数据值的顺序不需要通过编码和后续解码来保持。
SET OF 似乎没有排序(例如,字典顺序),因此发送者可以将它们按任何顺序排列,而接收者可以重新排序它们。
但是,11.6 说:
11 CER 和 DER 对 BER 的限制
...
11.6 分量
集 一组值的分量值的编码应按升序出现,编码作为八位字节串进行比较,较短的分量填充在它们以 0 字节结尾。注 — 填充八位字节仅用于比较目的,不会出现在编码中。
在上面,他们说BER可以是任何顺序,但CER和DER是升序。
最后但并非最不重要的一点是,引言说:
引言
...
... 如果编码包含一个集合值或一组值并且不需要规范和区分编码规则施加的限制,则基本编码规则比规范或区分编码规则更适合。 ..
所以引言推荐 BER 用于 SET OF。
但总的来说:证书是 BER。就是这样签的。由于证书数据的签名,一旦他们获得证书,GnuTLS 就无法改变这一点。
GnuTLS 可以自由地以 DER 编码创建证书。他们只是不能在事后强加编码。
(评论)gnutls_certificate_set_x509_key_file(xcred, CERT_URL, KEY_URL, GNUTLS_X509_FMT_PEM);
我查看了最新的 GnuTLS 资源。这似乎是它在src/serv.c
.
显然,_asn1_ordering_set_of
过去没有按预期工作。它在 2014 年 4 月得到了改进。请参阅补丁 1/3:使 _asn1_ordering_set_of()在 GnuTLS 邮件列表中真正排序(和朋友)。
以下是来源中的热门歌曲:
$ grep -R -n _asn1_ordering_set_of * | grep -v doc
lib/minitasn1/coding.c:832: /* Function : _asn1_ordering_set_of */
lib/minitasn1/coding.c:843: _asn1_ordering_set_of (unsigned char *der, int der_len, asn1_node node)
lib/minitasn1/coding.c:1261: err = _asn1_ordering_set_of (der + len2, counter - len2, p);
第 1261 行周围的用途是用于asn1_der_coding
. asn1_der_coding
在其他组件中更频繁地使用...
(评论)但我不确定它是 GNTls 中的错误,而不是服务器端的错误,所以我想在做任何事情之前先了解它应该如何工作
您可能应该联系B.3 错误报告中详细介绍的 GnuTLS 人员。它看起来像是处理非 GnuTLS 证书的错误。
需要明确的是,GnuTLS 在创建证书时使用 DER,这很好。但是 GnuTLS 在收到非 GnuTLS 证书后无法强制排序,因为这会使签名无效。
他们的测试套件可能错过了它,因为 GnuTLS DER 编码了 SET OF。他们可能没有意识到它的发生。