Как выполнить максимально сложную проверку SSL-сертификата с помощью кода .NET?

Нам посчастливилось запустить службу REST API, которая предоставляет конечную точку https://. Недавно мы изменили наш SSL-сертификат, и несколько пользователей, в основном пользователи libcurl и Java, жаловались, что они больше не могут проверять сертификат, а их программы отказываются подключаться к нашему сервису. Другие пользователи, в том числе пользователи .NET, проблем не наблюдали. Firefox также с удовольствием открывает страницы на сайте с этим сертификатом.

Нам нужно создать некоторый код, который проверяет сертификаты самым сложным способом, прежде чем мы будем использовать их в производстве.

Я создал фрагмент кода, который создает объект X509Certificate2 для сертификата, а затем пытается X509Chain.Build() из него:

var certDataArray = File.ReadAllBytes( path );
var cert = new X509Certificate2( certDataArray, password );
var chain = new X509Chain();
var result = chain.Build(cert);
var status = chain.ChainStatus;

Этот код работает нормально для нашего предыдущего сертификата (срок действия которого еще не истек) и терпит неудачу (Build() возвращает false, а X509Chain.ChainStatus содержит ряд элементов - X509ChainStatusFlags.RevocationStatusUnknown, X509ChainStatusFlags.PartialChain, X509ChainStatusFlags.OfflineRevocation). Таким образом, похоже, что для этого конкретного сертификата этой проверки достаточно.

Достаточно ли X509Chain.Build() для того, чтобы все наши пользователи могли успешно проверить сертификат? Нужны ли другие проверки?


person sharptooth    schedule 08.09.2015    source источник
comment
Что вы изменили в аттестате? Вы использовали новый ЦС/эмитент?   -  person stephen.vakil    schedule 08.09.2015
comment
@ stephen.vakil Новый сертификат пришел из другого ЦС, и что-то не так с инфраструктурой этого ЦС, что помешало тщательной проверке. Это действительно имеет значение?   -  person sharptooth    schedule 09.09.2015


Ответы (1)


Код X509ChainStausFlags.PartialChain является признаком того, что у вас есть проблема. По крайней мере, один сертификат в цепочке а) не имеет издателя, который уже находится в ваших локальных хранилищах сертификатов, и б) не имеет разрешимого расширения доступа к информации о центрах сертификации, которое позволяет системе загружать сертификат (хотя это также может быть сетевой ошибкой). ).

Если отсутствующий сертификат является корневым, то предоставление его в chain.ChainPolicy.ExtraStore (до вызова Build) изменит X509ChainStatusFlags.PartialChain на X509ChainStatusFlags.UntrustedRoot. Если это промежуточное звено, то это вполне может привести к успешному построению цепи.

Код OfflineRevocation кажется странным, поскольку вы не указали X509RevocationMode.Offline (по крайней мере, не в своем фрагменте здесь).

person bartonjs    schedule 06.07.2016