Каким образом это должно быть сделано ...
МСЭ рекомендует НАБОР быть закодированы с использованием BER, до тех пор, пока нет необходимости в CER или DER. Лучшее, что я могу сказать, не нужно. См. Ниже подробное объяснение в области МСЭ и ASN.1.
Однако, GnuTLS может быть соблюдение стандарта, который создает потребность. В этом случае я не знаю, какой именно стандарт. См. Ответ Курта.
Я посмотрел
RFC 5280, PKIX Certificate and CRL Profile, но я не мог найти ограничение. Возможно, это в другом документе PKIX.
это ошибка GnuTLS или другие библиотеки просто опустить упорядоченность?
Я не полагаю, что ее ошибка в GnuTLS сам по себе. Это так, как библиотека делает вещи. Примите это по модулю требование сделать это в RFC или другом стандарте.
Также обратите внимание, что другие библиотеки не пропускают порядок. Они используют порядок атрибуты, представленные в сертификате, который является упорядоченность :)
(комментарий) Проблема заключается в том, что GnuTLS переставляя результаты неудачной аутентификации SSL
Это звучит как ошибка для меня (по модулю требований стандартов). В этом случае ошибка переупорядочивает SET OF после того, как подпись будет помещена в TBS/Certificate.
Если GnuTLS является, строя TBS/Certificate, то его ОК, чтобы изменить порядок, пока подпись не будет помещена на него.
(комментарий) Есть ли GnuTLS поставить элементы множества типа в правильном порядке в соответствии с правилами МЭД
В ASN.1 encoding rules, X.690, BER/CER/DER:
8.12 Кодирование набора - значение
...
8.12.3. Порядок значений данных не должен сохраняться в кодировке и su последующее декодирование.
SET OF не представляется упорядоченным (например, лексикографическим порядком), поэтому отправитель может поместить их в любом порядке, и получатель может их переупорядочить.
Однако, 11.6 говорит:
11 Ограничения на BER используемые как CER и DER
...
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 года.См. PATCH 1/3: Make _asn1_ordering_set_of() really sort (и друзей) в списке рассылки 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
чаще используется в других компонентах ...
(комментарий), но я не уверен, что это ошибка в GnuTLS, а не на стороне сервера, поэтому я хотел бы узнать, как он должен работать, прежде чем что-либо делать
Возможно, вы должны связаться с людьми GnuTLS, как описано в B.3 Bug Reports. Это похоже на ошибку при обработке сертификатов, отличных от GnuTLS.
Чтобы быть ясным, GnuTLS использует DER при создании сертификатов, и это нормально. Но GnuTLS не может навязывать заказ после получения сертификата не-GnuTLS, поскольку это делает недействительной подпись.
Их набор тестов, вероятно, пропускает его, потому что GnuTLS DER кодирует SET OF. Вероятно, они не знают о его происхождении.
* Почему GnuTLS сортирует набор последовательностей * - возможно, это подготовка к сериализации DER. – mkl
@elevener - какой URL-адрес требуется для получения сертификата с ошибкой проверки GnuTLS? – jww