C# - 从 .NET 应用程序访问 HTTPS URL(不导入服务器证书)不会抛出 SSL 异常

标签 c# .net ssl ssl-certificate x509certificate

我正在尝试在 C# 中实现服务器身份验证(使用 .NET appln)。我想实现以下目标:

  1. 使用

    连接到 HTTPS URL
        String sslServerHost = "https://mail.google.com";
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sslServerHost);
    
  2. 如果 HTTPS 请求失败,我会将服务器证书添加到本地 Windows 证书存储区。

        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);
    
        // Code to import server certifictes to windows store.
    
        userCaStore.Open(OpenFlags.ReadOnly);
        userCaStore.Add(cert2);
    

以下是我用于执行服务器身份验证的 C# 代码。

从下面的代码片段可以明显看出,我既没有忽略证书验证,也没有将 X509Certificate 添加到本地信任库,但我仍然能够建立与 HTTPS URL 的连接(WebRequest.create(url) request.GetResponse() 不会抛出任何异常)

        String sslServerHost = "https://mail.google.com";
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sslServerHost);
        request.AllowAutoRedirect = false;

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

      try
        {    
            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);
        }

既然我没有将服务器证书 (X509Certificate) 添加到本地 Windows 应用商店,为什么我在尝试访问 HTTPS URL 时没有收到异常。

简而言之,如何在 C# 中实现或实现服务器身份验证,如果未添加服务器证书,则 C# 代码应抛出异常。

对于 Java,有一个很好的链接 https://github.com/escline/InstallCert/blob/master/InstallCert.java这最好地描述了服务器身份验证机制,如果客户端尝试访问 HTTPS 服务器并且如果服务器的证书不存在于 Java 信任库中,则 JVM 会抛出异常。

此机制似乎不适用于 .NET 应用程序。任何帮助或见解将不胜感激!!

最佳答案

原因可能是 mail.google.com 已经被信任,因为证书链指向一些已经在您的证书存储中的根证书(在“受信任的根证书颁发机构”中) .

如果您想测试失败,请按照教程使用 OpenSSL 之类的工具创建您自己的 CA 和证书。然后使用这个不受信任的证书在 IIS 中设置一个网站。

关于C# - 从 .NET 应用程序访问 HTTPS URL(不导入服务器证书)不会抛出 SSL 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50861338/

相关文章:

c# - 为什么 XmlSerializer 要求从 IEnumerable 继承的类型具有 Add(System.Object) 的实现?

c# - 与 ASPNET Core 和 websockets 的双向通信

apache - 强制用户访问 https ://and non www address format

php - Apache CURL 错误 SSL : CA certificate set, 但证书验证被禁用

c# - 事件处理程序应该用他们的委托(delegate)来装饰吗?

c# - 使用 timeBeginPeriod/Task 调度时的 Thread.Sleep 与 Task.Delay

c# - 自定义任务计划程序按日期时间启动任务

c# - 使用转换方法覆盖类型中的虚方法

c# - NHibernate Validator - 传递资源管理器和 key

java - 无法找到请求目标的有效证书路径 - 即使在导入证书后也会出现错误