При создании Запроса 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:.....
Что такое подход "лучшей практики" для этого сценария?
Спасибо!
Если вы действительно хотите привязать его к одному конкретному сертификату, вы можете сравнить данные сертификата (в формате DER) с байтом []
в сертификате. .GetRawCertData ()
.
Вы также можете использовать GetCertHashString ()
и Subject
в параметре сертификата
в RemoteCertificateValidate
, чтобы получить необходимую информацию . Имя хоста должно быть в альтернативном имени субъекта сертификата или, если альтернативное имя субъекта отсутствует, в CN субъектного (отличительного) имени. Учитывая то, как .NET форматирует строку темы, это должно быть первое CN =, которое вы там найдете.
Вы также получите больше данных, если сертификат
является экземпляром X509Certificate2
. После этого вы сможете получить SubjectName
как X500PrincipalName
, а также Extensions
(чтобы проверить расширение альтернативного имени субъекта). Может быть полезно использовать такие инструменты, как BouncyCastle, для разбора имени субъекта.
Вы также можете получить дополнительную информацию об имени хоста, с которым пытаетесь связаться, в отправителе
, в зависимости от его типа времени выполнения.