Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 通过SSL进行WCF通信:由于第三方受信任的根证书颁发机构,WCF访问出现问题_.net_Wcf_Security_Ssl - Fatal编程技术网

.net 通过SSL进行WCF通信:由于第三方受信任的根证书颁发机构,WCF访问出现问题

.net 通过SSL进行WCF通信:由于第三方受信任的根证书颁发机构,WCF访问出现问题,.net,wcf,security,ssl,.net,Wcf,Security,Ssl,我有一个WCF服务,它使用具有传输安全性的证书身份验证。该服务部署在windows服务中,使用wshttp绑定 当我尝试在调试模式下访问该服务或在本地计算机上作为服务部署后,我总是会收到错误“HTTP请求被禁止,客户端身份验证方案为匿名” 在一周的时间里,我跌跌撞撞地发现了微软的这篇知识库文章 KB 931125包安装了330多个第三方根认证机构。目前,Schannel安全包支持的受信任证书颁发机构列表的最大大小为16 KB。拥有大量第三方根认证机构将超过16k限制,您将遇到TLS/SSL通信

我有一个WCF服务,它使用具有传输安全性的证书身份验证。该服务部署在windows服务中,使用wshttp绑定

当我尝试在调试模式下访问该服务或在本地计算机上作为服务部署后,我总是会收到错误“HTTP请求被禁止,客户端身份验证方案为匿名”

在一周的时间里,我跌跌撞撞地发现了微软的这篇知识库文章

KB 931125包安装了330多个第三方根认证机构。目前,Schannel安全包支持的受信任证书颁发机构列表的最大大小为16 KB。拥有大量第三方根认证机构将超过16k限制,您将遇到TLS/SSL通信问题

我尝试了他们删除第三方可信机构的解决方案,发现我甚至无法浏览谷歌或任何支持https的网站

但解决方案奏效了,我能够调用我的WCF服务

现在我已经从KB链接恢复了第三方可信机构,因为我无法访问许多站点,vpn、电子邮件也无法工作

恢复后,我再次无法访问我的WCF服务

解决这个问题的最佳方法是什么

我现在得到了解决方案,需要执行以下操作

来源

解决这个问题的最佳方法是什么

在.Net中,我们可以使用一个CA,而不是整个商店中的330+。Juval Lowy在第570页讨论了如何使用服务器的证书。Lowy谈到了验证和
IEndpointBehavior
以及
X509ServiceCertificateAuthentication

但是,我无法判断WCF是否具有类似于
SslStream
ServicePointManager
中的
RemoteCertificateValidationCallback
?如果可用,请使用所需的CA并从文件系统加载:

static bool VerifyServerCertificate(object sender, X509Certificate certificate,
    X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    try
    {
        String CA_FILE = "ca-cert.der";
        X509Certificate2 ca = new X509Certificate2(CA_FILE);

        X509Chain chain2 = new X509Chain();
        chain2.ChainPolicy.ExtraStore.Add(ca);

        // Check all properties
        chain2.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;

        // This setup does not have revocation information
        chain2.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;

        // Build the chain
        chain2.Build(new X509Certificate2(certificate));

        // Are there any failures from building the chain?
        if (chain2.ChainStatus.Length == 0)
            return true;

        // If there is a status, verify the status is NoError
        bool result = chain2.ChainStatus[0].Status == X509ChainStatusFlags.NoError;
        Debug.Assert(result == true);

        return result;
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }

    return false;
}
我还没有弄清楚默认情况下如何使用此链(
chain2
),因此不需要回调。也就是说,将其安装在ssl套接字上,连接将“正常工作”。我还没有弄清楚如何安装它,从而将其传递到回调中。也就是说,我必须为每次回调调用构建链。我认为这些是.Net中的架构缺陷,但我可能遗漏了一些明显的东西


类似的答案出现在两个问题中,如。

我遇到的问题是客户端无法进行握手,因此无法将证书发送到呼叫。我在测试System.Net.ServicePointManager.ServerCertificateValidationCallback+=(se、cert、chain、sslerror)=>{return true;}的代码中已经有了这个;