Я должен проверить несколько сертификатов SSL в не-браузере для соединений HttpRequests
и websocket
, которые должны запускаться на IOS, Android и Linux. Когда происходит соединение через HTTPS
, я получаю массив из X509Certificate2
объектов, где нижний - это сертификат сервера, а самый верхний - корневой СА (надеюсь). В качестве примера, когда я подключаюсь к https://google.com
я получаю 3 X509Certificate2
со следующим SubjectName.Name
:Как правильно проверить сертификат SSL с помощью X509Certificate2 на Mono и нескольких платформах
- 0:
"CN=google.com, O=Google Inc, L=Mountain View, S=California, C=US"
- 1:
"CN=Google Internet Authority G2, O=Google Inc, C=US"
- 2:
"CN=GeoTrust Global CA, O=GeoTrust Inc., C=US"
мне теперь нужно проверить подтверждение валидации с данной информацией и следующие проверки:
- цепочки поставок целевых проверки
- Hostname проверки
- проверки отзыва сертификатов
То, что я пытался и не понял и не удалось:
Когда я вызываю метод X509Certificate2.Verify()
каждого сертификата независимо он возвращает false
каждый раз. Я также не понимаю, почему он может вернуть что-нибудь еще, а затем false
, потому что проверка происходит независимо. Вместо этого нужно проверить всю цепочку, то есть все сертификаты, насколько я понял теорию.
Затем я использовал X509Chain
класс:
foreach (X509Certificate2 cert in allthreecerts)
{
X509Chain chain = new X509Chain();
X509ChainPolicy chainPolicy = new X509ChainPolicy()
{
RevocationMode = X509RevocationMode.Offline,
RevocationFlag = X509RevocationFlag.EntireChain
};
chain.ChainPolicy = chainPolicy;
if (!chain.Build(cert))
{
foreach (X509ChainElement chainElement in chain.ChainElements)
{
foreach (X509ChainStatus chainStatus in chainElement.ChainElementStatus)
{
Debug.WriteLine(chainStatus.StatusInformation);
}
}
}
}
Это печатает RevocationStatusUnknown
и OfflineRevocation
для каждого сертификата.
Опять же, я не понимаю, почему это должно сработать, так как цепочка строится независимо от каждого сертификата. Не должен ли родительский сертификат выдавать дочерний сертификат до корневого ЦС?
Что мне кажется, мне нужно как-то, но не знаю, как это сделать.
Для проверки отзыва сертификата все клиенты должны предоставить список отзыва сертификатов. Где я могу получить такой список и где его загрузить и указать цепочке для использования этого локального списка?
Та же проблема - проверка цепочки доверия, поскольку последний сертификат должен быть корневым сертификатом и должен быть одним из доверенных корневых центров сертификации клиентов. Поэтому мне приходится загружать, например, все корневые ЦС, которые поставляются с Firefox, и проверить, является ли корневой ЦС одним из них? Каков наилучший способ сделать это?
[Обновить] Я сделал ошибку с копией в примере google.com
, где я вставил два одинаковых имени объекта сертификата.
'RevocationMode = X509RevocationMode.Offline' - переключить его на' Online'. Клиент должен иметь локальный кеш CRL/OCSP для успешной проверки отмены в автономном режиме. – Crypt32
Ну, это точка. Я реализую «клиент». Итак, как мне предоставить такой CRL. Это был вопрос, который я задаю. – zlZimon
CRL извлекаются из онлайн-ресурсов. Местоположение CRL указывается в расширении сертификата CRL Distribution Points. Или в разделе «Протокол состояния он-лайн сертификата» в расширении «Доступ к официальным данным». – Crypt32