Как я могу игнорировать ошибки SSL при подключении к одной конечной точке, а не к другим?

Я пишу веб-API, который вызывает две разные конечные точки, обе с использованием HTTPS.

Одна из конечных точек (A) не использует правильный сертификат. В частности, он использует сертификат с CN*.foo.bar, но конечная точка, к которой я подключаюсь, является a.b.foo.bar. Они находятся в процессе его исправления, но у них нет графика, сколько времени это займет, и мы не можем позволить себе ждать, пока они исправят его, чтобы продолжить наше функциональное тестирование.

Как я могу игнорировать ошибки SSL-сертификата при подключении к A, а не при подключении к B?

В настоящее время я видел, как это делается во время моего исследования, чтобы сделать что-то вроде

ServicePointManager.ServerCertificateValidationCallback =
    (sender, certificate, chain, errors) => true;

Однако я не хочу отключать его для обеих конечных точек, просто A.

2 ответа

  1. Просто реализуйте RemoteCertificateValidationCallback, где вы проверяете, является ли если отправитель из конечной точки A и если это возвращает true. В противном случае верните true, если ошибок нет. Затем установите ServicePointManager.ServerCertificateValidationCallback для вновь созданного RemoteCertificateValidationCallback.

  2. Вдохновленный кодом этого ответа SO, вы можете фактически проверить сертификат происхождения, используя, например, отпечаток сертификата, который вы можете получить от их сертификата:

    ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) =>
    {
        if (certificate.GetCertHashString().Equals("remote certificate thumbprint"))
            return true;
        return false;
    };
    

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

    Значение отпечатка пальца можно узнать на следующем экране при использовании Windows:

    Отпечаток большого пальца