Подтвердите удаленный сертификат SSL во время запроса HTTPS - PullRequest
8 голосов
/ 23 июня 2010

При отправке HTTPS-запроса на удаленный веб-сервер я использую WebRequest, который устанавливает безопасное соединение с удаленным веб-сервером. Во время разработки я использую самоподписанный сертификат на сервере, и WebRequest не может установить безопасное соединение, так как сертификат недействителен, что является ожидаемым поведением.

Я нашел этот код, который "проверяет" проверку сертификата, активируется путем вызова метода SetCertificatePolicy() в следующем коде.

public static void SetCertificatePolicy()
{
    ServicePointManager.ServerCertificateValidationCallback
                += RemoteCertificateValidate;
}

/// <summary>
/// Remotes the certificate validate.
/// </summary>
private static bool RemoteCertificateValidate(
    object sender, X509Certificate cert,
    X509Chain chain, SslPolicyErrors error)
{
    // trust any certificate!!!
    System.Console.WriteLine("Warning, trust any certificate");
    return true;
}

Мне интересно, можно ли сделать специальные проверки для удаленного сертификата SSL (например, с использованием приведенного выше кода), чтобы я мог проверить, что удаленный веб-сервер использует действительный сертификат SSL, а не только какой-либо действительный сертификат, но именно тот, который я хочу? Например, я хочу убедиться, что я разговариваю с сайтом www.someplace.com, сертификат выдан ACME Inc, с отпечатком пальца 00:11:22: .....

Что такое подход «наилучшей практики» для этого сценария?

Спасибо!

1 Ответ

8 голосов
/ 23 июня 2010

Если вы действительно хотите привязать его к одному конкретному сертификату, вы можете сравнить данные сертификата (в формате DER) с byte[] в certificate.GetRawCertData().

Вы также можете использовать GetCertHashString() и Subject для параметра certificate в RemoteCertificateValidate, чтобы получить информацию, которую вы ищете. Имя хоста должно быть в альтернативном имени субъекта сертификата или, если нет альтернативного имени субъекта, в CN субъектного (выделенного) имени. Учитывая способ .NET форматирует строку темы, это должен быть первый CN =, который вы там найдете.

Вы также получите больше данных, если certificate является экземпляром X509Certificate2. После этого вы сможете получить SubjectName как X500PrincipalName, а также Extensions (чтобы проверить расширение альтернативного имени субъекта). Для анализа имени субъекта может быть полезно использовать такие инструменты, как BouncyCastle.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...