C # Извлечение сертификатов сервера из URL-адреса HTTPS вызывает исключение System.PlatformNotSupportedException - PullRequest
0 голосов
/ 12 июня 2018

Я использую приведенный ниже фрагмент кода для получения (или получения) сертификатов с веб-сайта HTTPS URL в C #.

Похожий код выкладывается здесь -> Открыть информацию о сертификате из веб-браузера и C # Скачать все сертификаты https с веб-сайта , но ничто не помогает мне иЯ продолжаю получать исключение в строке ниже #

           X509Certificate cert = request.ServicePoint.Certificate;

Исключение:

   System.PlatformNotSupportedException: 'Operation is not supported on this platform.'

КОД:

 private static void Main(string[] args)
    {
        String sslServerHost = "https://docs.genesys.com/Documentation"
        HttpWebRequest request = (HttpWebRequest) WebRequest.Create( sslServerHost);
        request.AllowAutoRedirect = false;

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        response.Close();


       X509Certificate cert = request.ServicePoint.Certificate;

        //convert the X509Certificate to an X509Certificate2 object by passing it into the constructor
       X509Certificate2 cert2 = new X509Certificate2(cert);

        X509Store userCaStore = new X509Store(storeName: StoreName.Root, storeLocation: StoreLocation.CurrentUser);
        try
        {
            userCaStore.Open(OpenFlags.ReadOnly);
            userCaStore.Add(cert2);

            Stream dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);
            string responseFromServer = reader.ReadToEnd();
            Debug.WriteLine(responseFromServer);
            Console.WriteLine(responseFromServer);

        } catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }

    }

ОБНОВЛЕНИЕ

ServicePoint.Certificate не поддерживается в проектах .NET Core, поэтому я попытался использовать обратный вызов для проверки сертификата сервера, используя следующий код:

request.ServerCertificateValidationCallback += (sender, validatedCert, chain, 
errors) => { X509Certificate cert = new X509Certificate2(validatedCert); 
Console.WriteLine("Inside callback" + cert); return errors == 
System.Net.Security.SslPolicyErrors.None; }

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

Более того, я не получаю никаких исключений при попытке подключиться к URL-адресу HTTPS без добавления сертификата сервера в доверенное хранилище.Может кто-нибудь, пожалуйста, дайте мне знать, почему мы не получаем никаких исключений (в приложении .NET) при попытке доступа к URL-адресу HTTPS, учитывая, что я не проигнорировал проверку сертификата.

1 Ответ

0 голосов
/ 14 июня 2018

Использование устаревшего HttpWebRequest на ядре .Net вызывает проблемы.Вы должны переключиться на HttpClient и установить callback для экземпляра HttpClientHandler.

  var handler = new HttpClientHandler();
  handler.ServerCertificateCustomValidationCallback = (request,cert,chain,error) => true;
  var client = new HttpClient(handler);
...