2015-05-12 1 views
2

Я использую GnuTLS 3.4.1. У меня есть сертификат x509 с набором последовательностей внутри. Сертификат хранится таким образом на смарт-карте.Ошибка подтверждения подписи из-за переупорядочения через _asn1_ordering_set_of

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 или другие библиотеки просто опусканием заказов?

+0

* Почему GnuTLS сортирует набор последовательностей * - возможно, это подготовка к сериализации DER. – mkl

+1

@elevener - какой URL-адрес требуется для получения сертификата с ошибкой проверки GnuTLS? – jww

ответ

1

Каким образом это должно быть сделано ...

МСЭ рекомендует НАБОР быть закодированы с использованием 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. Вероятно, они не знают о его происхождении.

+0

Проблема заключается в том, что перенастройка GNUTLS приводит к неудачной аутентификации SSL. Таким образом, вопрос прав GNUTls, и он «ставит элементы типа SET OF в правильном порядке в соответствии с правилами DER» или нет таких правил для SEQUENCES, и он делает это сам по себе. – elevener

+0

@elevener - это звучит как ошибка для меня. На всякий случай, вы должны показать часть своего кода вокруг проверки. Вы также можете добавить этот факт к своему вопросу, поскольку он кажется важным фактом :) – jww

+0

Код довольно прост. Установить сертификат клиента через – elevener

2

RFC5280 имеет:

4.1. Поля базового сертификата

Основной синтаксис сертификата X.509 v3 заключается в следующем. Для подписи данные, которые должны быть подписаны, кодируются с использованием ASN.1 выданных правил кодирования (DER) [X.690].

Так что мне кажется, что GnuTLS делает все правильно.

Он также выглядит так, будто он пытается кодировать Distinguished Name, но делает это неправильно. Это действительно в соответствии с ASN1, потому что спецификация просто очень странная. Вы можете иметь несколько значений для каждой части. Но вы хотите CN, SN и т. Д. Каждый в своем собственном SET, поэтому все эти SEQUENCE должны иметь свой собственный SET.

+0

Спасибо Kurt. Я не знал об этом. Два вопроса: (1) есть способ смягчить ограничения GnuTLS, поэтому он принимает BER (из-за подписи); и (2) следует ли сообщать об ошибке в OpenSSL для продвижения взаимодействия (и соответствия)? Для (1), 'tbsCertificate' должен быть DER. Я не уверен в прыжке, что подписанные данные должны быть переупорядочены. – jww

+0

Может ли кто-нибудь отправить сертификат на [email protected]? –

+0

Kurt - это своего рода интересная проблема со стороны политики/процедуры. Я попросил список рассылки PKIX получить некоторую обратную связь по проверке (GnuTLS, и вы явно правы относительно DER и подписываете 'tbsCertifcate'). См. [Требования к проверке подписей и требованиям DER] (https://www.ietf.org/mail-archive/web/pkix/current/msg33308.html). – jww

Смежные вопросы