2015-09-08 5 views
5

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

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

Я обработал кусок кода, который создает 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(), чтобы все наши пользователи могли успешно проверить сертификат? Требуются ли какие-либо другие проверки?

+0

Что вы изменили в своем сертификате? Вы использовали новый CA/эмитент? –

+0

@ stephen.vakil Новый сертификат поступает из другого ЦС и что-то не так с этой инфраструктурой ЦС, что предотвращает тщательную проверку. Это действительно имеет значение? – sharptooth

ответ

3

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

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

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