C#从HTTPS URL获取服务器证书会引发System.PlatformNotSupportedException异常

时间:2018-06-12 13:22:14

标签: c# .net ssl ssl-certificate x509certificate

我正在使用以下代码段来从C#中的HTTPS URL网站获取(或获取)证书。

此处发布了类似的代码 - > Open Certificate Information from Web Browser ControlC# Download all https certificates from a website  但没有什么可以帮助我,我继续在#

行以下获得例外
           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);
        }

    }

更新

.NET Core项目不支持ServicePoint.Certificate,因此我尝试使用以下代码使用服务器证书验证回调:

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

似乎没有调用上面的回调。你们中的任何人都可以告诉我们上面的回调何时会被执行。

此外,在尝试连接到HTTPS URL而不将服务器证书添加到信任存储区时,我没有遇到任何异常。任何人都可以告诉我为什么我们在尝试访问HTTPS URL时没有得到任何异常(在.NET应用程序中),因为我没有忽略证书验证。

1 个答案:

答案 0 :(得分:0)

在.Net核心上使用遗留HttpWebRequest正在寻找麻烦。 您应该切换到HttpClient并在HttpClientHandler实例上设置callback

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