Проверьте удаленный сертификат SSL во время Запроса HTTPS

При создании Запроса 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:.....

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

Спасибо!

8
задан mr.b 23 June 2010 в 12:13
поделиться

1 ответ

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

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

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

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

8
ответ дан 5 December 2019 в 20:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: