C# 使用SetCertificatePolicy()为安全web服务建立信任关系

C# 使用SetCertificatePolicy()为安全web服务建立信任关系,c#,web-services,ssl,ssl-certificate,C#,Web Services,Ssl,Ssl Certificate,我已经用C#编写了一个.NET应用程序,它可以联系一些web服务。当我在一个不安全的URL上引用web服务时,一切正常;但是,当我在安全HTTPS URL上引用相同的web服务时,我得到一个异常消息“无法为SSL/TLS安全通道建立信任关系” 我被指向这个网页。并将代码添加到我的应用程序中。这就解决了这个问题,我现在可以按预期使用安全web服务了 我注意到上面的代码片段说“不打算在生产环境中使用”,并且它目前信任任何证书。为了使它在生产环境中更安全,我是否应该检查它是否有我们自己的证书?我应该如

我已经用C#编写了一个.NET应用程序,它可以联系一些web服务。当我在一个不安全的URL上引用web服务时,一切正常;但是,当我在安全HTTPS URL上引用相同的web服务时,我得到一个异常消息“无法为SSL/TLS安全通道建立信任关系”

我被指向这个网页。并将代码添加到我的应用程序中。这就解决了这个问题,我现在可以按预期使用安全web服务了

我注意到上面的代码片段说“不打算在生产环境中使用”,并且它目前信任任何证书。为了使它在生产环境中更安全,我是否应该检查它是否有我们自己的证书?我应该如何检查,RemoteCertificateValidate()方法中的'cert'参数包含大量信息,因此我不确定应该如何检查或检查什么


TIA

当客户端建立安全SSL连接时,服务器用于标识自身身份的证书很可能存在问题。根据我的经验,这主要是由于服务器返回的证书不是由受信任的根颁发机构签署的,或者链中的一个或多个证书无效(例如,它们已过期或是针对您连接的域以外的域)

为了帮助识别问题,您可以尝试浏览到服务端点URL,并查看浏览器是否报告任何问题。现代浏览器会在服务器证书无效时向您发出警告,有时还会告诉您原因。如果您使用的是Chrome,并且证书存在问题,您将通过地址栏(或omnibox)左端的挂锁图标看到一个红十字。如果你点击挂锁,Chrome会告诉你为什么它不喜欢证书

至于您找到的代码片段,这是一个如何在.Net中作为客户端实现服务器证书验证的示例。但是,即使服务器证书有问题,示例本身也不会拒绝与服务器的连接,因此会出现关于在生产中不使用代码的注释。在测试场景之外,您永远不希望与由于坏证书而无法信任其身份的服务器通信。要提供“生产”实现,必须检查“error”参数的值,以查看证书是否存在任何问题,如果没有问题,则仅返回true

using System;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Attach my certificate validation delegate.
            ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;

            System.Net.HttpWebRequest request = WebRequest.CreateHttp("https://www.google.com");
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
        }

        private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error)
        {
            if (error == SslPolicyErrors.None)
            {
                return true;
            }

            return false;
        }
    }
}
在本例中,如果error的值等于SslPolicyErrors.None,则我仅从ServerCertificateValidationCallback委托返回true,否则返回false将生成异常。为了使这个示例起作用,我使用代理请求并将不受信任的证书返回给我的客户机代码。如果您在正常情况下导航到,您应该而不是看到任何证书错误,因为谷歌玩得很好

带有证书的PKI可能是一个棘手的领域。文档介绍了如何使用受信任的机构对SSL中使用的证书进行签名,以便客户端可以信任与之通信的服务器的身份