当前位置:  开发笔记 > 后端 > 正文

如何解决"无法与权限建立SSL/TLS安全通道的信任关系"

如何解决《如何解决"无法与权限建立SSL/TLS安全通道的信任关系"》经验,为你挑选了10个好方法。

真的以为我修好了这个问题,但之前只是伪装了.

我使用HTTPS在IIS 7中托管了WCF服务.当我在Internet Explorer中浏览到此站点时,它就像一个魅力,这是因为我已将证书添加到本地根证书颁发机构商店.

我正在一台机器上开发,所以客户端和服务器是同一台机器.该证书直接从IIS 7管理管理单元自签名.

我现在不断得到这个错误......

无法为具有权限的SSL/TLS安全通道建立信任关系.

...从客户端控制台调用时.

我手动给自己的权限和网络服务证书,使用findprivatekey和使用cacls.exe.

我试图使用SOAPUI连接到服务,这是有效的,所以它必须是我的客户端应用程序中的一个问题,这是基于过去使用http的代码.

在哪里可以看到我似乎已经耗尽了为什么我无法连接的所有可能性?



1> Joachim Kers..:

作为一种变通方法,你可以一个处理程序添加到ServicePointManagerServerCertificateValidationCallback客户端上:

System.Net.ServicePointManager.ServerCertificateValidationCallback +=
    (se, cert, chain, sslerror) =>
        {
            return true;
        };

但请注意,这不是一个好的做法,因为它完全忽略了服务器证书,并告诉服务点经理无论哪种证书都可以,这会严重损害客户端的安全性.您可以对此进行优化并进行一些自定义检查(对于证书名称,哈希等).至少你可以在开发过程中避免使用测试证书时的问题.


我认为大多数公共设置都将使用购买的证书,但在开发期间使用条件#if语句中的上述代码.企业开发人员通常应该设置一个内部CA服务器>> http://technet.microsoft.com/en-us/library/cc875810.aspx
真棒!你可以使用lambda表达式作为System.Net.ServicePointManager.ServerCertificateValidationCallback + =(se,cert,chain,sslerror)=> true;
帮助我弄清楚如何让我的SSL WCF调用与Fiddler2一起进行调试.
@karank考虑将它放在Global.asax的Application_Start方法中(参见http://stackoverflow.com/a/12507094/1175419).我强烈建议使用#if DEBUG编译器指令或Luke评论中提到的类似内容.

2> Mike Cheel..:

当我遇到这个问题时,因为client.config的端点如下:

 https://myserver/myservice.svc 

但证书是期待的

 https://myserver.mydomain.com/myservice.svc

更改端点以匹配服务器的FQDN可以解决我的问题.我知道这不是导致这个问题的唯一原因.


我的自动生成的配置有<端点地址="HTTPS://localhost/myservice.svc"更改为<端点地址="https://mymachine.mydoman.com/myservice.svc"解决了这个.

3> blowdart..:

您的问题出现是因为您使用的是自签名密钥.客户端不信任此密钥,密钥本身也不提供验证链或证书吊销列表.

你有几个选择 - 你可以

    关闭客户端的证书验证(坏动作,中间人攻击比比皆是)

    使用makecert创建根CA并从中创建证书(ok move,但仍然没有CRL)

    使用Windows证书服务器或其他PKI解决方案创建内部根CA然后信任该根证书(管理有点痛苦)

    从其中一个受信任的CA购买SSL证书(昂贵)


关于(4),[StartSSL](http://www.startssl.com/)实际上会为您提供免费的Class 1证书,该证书适用于所有主流浏览器.对于我的六个低带宽站点,它们对我很有用.

4> Sebastian Ca..:

前两个使用lambda,第三个使用常规代码...希望你发现它有用

            //Trust all certificates
            System.Net.ServicePointManager.ServerCertificateValidationCallback =
                ((sender, certificate, chain, sslPolicyErrors) => true);

            // trust sender
            System.Net.ServicePointManager.ServerCertificateValidationCallback
                = ((sender, cert, chain, errors) => cert.Subject.Contains("YourServerName"));

            // validate cert by calling a function
            ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);

    // callback used to validate the certificate in an SSL conversation
    private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
    {
        bool result = false;
        if (cert.Subject.ToUpper().Contains("YourServerName"))
        {
            result = true;
        }

        return result;
    }



5> Gaspa79..:

一线解决方案.在客户端调用服务器之前将其添加到任何位置:

System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };

这应仅用于测试目的,因为客户端将跳过SSL/TLS安全检查.


一个出色的测试解决方法。我们正在使用一种服务,该服务的提供者通过一系列复杂的安全证书使安全变成了现实,直到我们获得其不稳定的证书和链接正常工作为止,这种解决方法是唯一使我们能够继续开发的方法。

6> Jeroen-bart ..:

我遇到了同样的问题,我能够用两个解决方案来解决它:首先,我使用MMC管理单元"证书"作为"计算机帐户"并将自签名证书拖到"受信任的根证书颁发机构"文件夹中.这意味着本地计算机(生成证书的计算机)现在将信任该证书.其次,我注意到证书是为某些内部计算机名生成的,但是使用其他名称访问了Web服务.验证证书时,这会导致不匹配.我们为computer.operations.local生成了证书,但是使用https://computer.internaldomain.companydomain.com访问了Web服务.当我们将URL切换到用于生成证书的URL时,我们不再有错误.

也许只是切换URL会起作用,但通过使证书可信,您也可以避免Internet Explorer中的红色屏幕,它告诉您它不信任证书.



7> Rahul Rai..:

请执行以下步骤:

    在IE中打开服务链接.

    单击地址栏中提到的证书错误,然后单击查看证书.

    检查签发:名称.

    获取已颁发的名称,并使用完全限定的域名(FQDN)替换服务中的localhost和客户端端点基址.

例如:https:// localhost:203/SampleService.svc到https:// INL-126166-.groupinfra.com:203/SampleService.svc



8> 小智..:

如果您使用.net core,请尝试以下操作:

client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication =
        new X509ServiceCertificateAuthentication()
        {
            CertificateValidationMode = X509CertificateValidationMode.None,
            RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.NoCheck
        };



9> dar0x..:

我有同样的问题。我还在本地商店中添加了CA证书,但是我采用了错误的方式。

使用mmc控制台(开始->运行-> mmc),您应该将证书管理单元添加为服务帐户(选择IIS的服务帐户)或计算机帐户(为计算机上的每个帐户添加)

这是我在说什么的图片

从现在开始,您可以添加CA的证书(受信任的根CA中间CA),并且一切正常



10> NMrt..:

除上述答案外,如果客户端运行的TLS版本错误(例如,服务器仅运行TLS 1.2),则可能会遇到此错误。

您可以使用以下方法修复它:

// tested in .NET 4.5:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有