Как встроен параметр X509Chain в делегат RemoteCertificateValidationCallback?

1

RemoteCertificateValidationCallback, показанный ниже, используется для проверки сертификата удаленного SSL-сертификата. Параметр certificate - это сертификат сервера конечной сущности, возвращаемый удаленным сервером. Я не уверен в том, как chain параметр chain. Является ли он создан из списка сертификатов, возвращаемых удаленным сервером (как правило, сертификатом сервера и промежуточными сертификатами CA), или он отправляется в локальное хранилище сертификатов и пытается построить цепочку для сертификата сервера конечной сущности, возвращаемого в параметре certificate?

// The following method is invoked by the RemoteCertificateValidationDelegate. 
public static bool ValidateServerCertificate(
      object sender,
      X509Certificate certificate,
      X509Chain chain,
      SslPolicyErrors sslPolicyErrors)
{
    ...      

}

ОБНОВИТЬ

У меня есть подозрение, что он использует X509Chain.Build(server_cert), но хотел бы знать, что на самом деле происходит.

Этот человек видит нечто подобное: С# Получение сертификата из потока SSL показывает разные результаты цепочки и другие внешние инструменты a-certificate-from-an-ssl-stream-show-different-chain-result

Теги:

2 ответа

2
Лучший ответ

Он получен с сервера как часть рукопожатия TLS:

7.4.2. Сертификат сервера

Когда это сообщение будет отправлено:

Сервер ДОЛЖЕН отправлять сообщение "Сертификат" всякий раз, когда метод agreed- при обмене ключами использует сертификаты для аутентификации (сюда относятся все методы обмена ключами, определенные в этом документе, кроме DH_anon). Это сообщение всегда будет немедленно следовать за сообщением ServerHello.

Значение этого сообщения:

Это сообщение передает цепочку сертификатов сервера клиенту.

Сертификат ДОЛЖЕН быть подходящим для алгоритма обмена ключами согласованного шифрованного набора и любых согласованных расширений.

Структура этого сообщения:

 opaque ASN.1Cert<1..2^24-1>;

 struct {
     ASN.1Cert certificate_list<0..2^24-1>;
 } Certificate;

certificate_list

Это последовательность (цепочка) сертификатов. Сертификат отправителя должен быть первым в списке. Каждый следующий сертификат ДОЛЖЕН прямо засвидетельствовать предшествующий ему сертификат. Поскольку проверка сертификата требует, чтобы корневые ключи были распределены независимо, самозаверяющий сертификат, который определяет корневой центр сертификации, МОЖЕТ быть исключен из цепочки, исходя из предположения, что удаленный конец уже должен иметь его для подтверждения его в любом случае.

Ну, в соответствии с X509Chain.BuildChain() он использует CAPI CertGetCertificateChain, что означает, что он берется из локального хранилища сертификатов, созданного из данного сертификата. Вы можете увидеть, как обратный вызов проверки правильности вызывается в TransportSecurityHelpers.cs. Цепочка построена в _SecureChannel.VerifyRemoteCertificate:

chain = new X509Chain();
chain.ChainPolicy.RevocationMode = m_CheckCertRevocation? X509RevocationMode.Online : X509RevocationMode.NoCheck;
chain.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot;
if (remoteCertificateStore != null)
   chain.ChainPolicy.ExtraStore.AddRange(remoteCertificateStore);
if (!chain.Build(remoteCertificateEx)       // Build failed on handle or on policy
   && chain.ChainContext == IntPtr.Zero)   // Build failed to generate a valid handle
{
    throw new CryptographicException(Marshal.GetLastWin32Error());
}

Таким образом, похоже, что.Net берет сертификат сервера из контекста SSL и строит цепочку с использованием функций построения цепочки CAPI.

  • 1
    Я ценю, что протокол SSL может получать несколько сертификатов IA в дополнение к сертификату сервера, но я не уверен, что параметр X509Chain построен с использованием сертификатов IA, возвращаемых сервером. Для начала цепочка, которую я вижу, содержит якорь доверия который определенно не отправляется с сервера.
  • 0
    Да, это подтверждает мое подозрение. Спасибо! Знаете ли вы, есть ли способ получить действительный список сертификатов IA, возвращаемых с сервера?
Показать ещё 3 комментария
1

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

Этот метод предназначен для предоставления альтернативного механизма проверки удаленного сертификата (что обычно опасно).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню