无法为具有权限“xxxxx.com”的 SSL/TLS 建立安全通道

Posted

技术标签:

【中文标题】无法为具有权限“xxxxx.com”的 SSL/TLS 建立安全通道【英文标题】:Could not establish secure channel for SSL/TLS with authority 'xxxxx.com' 【发布时间】:2014-11-26 20:28:48 【问题描述】:

我正在尝试使用 VS2013 和 WCF 针对客户的 SOAP Web 服务编写客户端。网络服务本身在他们的防火墙后面,所以他们已经建立了一个我试图联系的代理。 (代理似乎是使用 MuleSoft 的 ESB 实现的,可能相关也可能不相关。)

我得到了一个 https: 网址和一个用户名/密码。当我将 url 加载到浏览器中时,系统会提示我输入用户名/密码,然后我会看到 .wsdl。 .wsdl 指定了一个我无法访问的内部 url,但我认为这是针对实际站点的。

当我在 VS2013 中使用代理 URL 创建服务引用时,系统会提示我 3 次输入用户名/密码,然后我得到一个正确的客户端、app.config 中的设置等。

app.config 中生成的绑定用于安全模式 Transport 的 basicHttpBinding,以及指向该不可访问的内部 url 的端点地址。

所以,从生成的绑定中,我:

    用我得到的代理 url 替换无法访问的内部 url。

    将安全模式更改为“TransportWithMessageCredentials”

    <bindings>
        <basicHttpBinding>
            <binding name="MyCustomersServiceSoapBinding">
                <security mode="TransportWithMessageCredential" >
                    <message clientCredentialType="UserName" />
                </security>
            </binding>
            <binding name="MyCustomersServiceSoapBinding1" />
        </basicHttpBinding>
    </bindings>
    

    用用户名和密码替换 ClientCredentials:

    使用 (var client = new MyCustomersServiceClient()) var loginCredentials = new ClientCredentials(); loginCredentials.UserName.UserName = "用户名"; loginCredentials.UserName.Password = "apassword";

    var defaultCredentials = client.Endpoint.Behaviors.Find<ClientCredentials>();
    client.Endpoint.Behaviors.Remove(defaultCredentials);
    client.Endpoint.Behaviors.Add(loginCredentials);
    
    var myData = new MyData
    
    ;
    
    
    var result = client.receiveData(myData);
    

当我运行它时,我得到一个异常:

无法为具有“xxxxx.com”权限的 SSL/TLS 建立安全通道。

环顾四周,我发现的大部分内容都表明 ssl 证书存在问题,但我不确定这是否有意义。如果是这种情况,我希望在通过浏览器查看 .wsdl 时会看到问题。而且我认为通过删除默认客户端凭据,我将绕过证书检查。而且我看到一些关于导致同样错误消息的更模糊问题的帖子。

我已打开 SOAP 消息记录,但它没有为我提供任何信息。它显示了失败的传出消息,但没有任何用处。

所以我一直在查看 Fiddler 的流量。我看到两条消息,一条 HTTP 消息发送到“Tunnel to”,结果为 200,一条 HTTPS 消息发送到代理 url,结果为 401。

此时,我看到了两种可能性:

    我需要按照错误消息提示的方式安装 SSL 证书,或者 问题只是我没有以它可以理解的方式向服务提供用户名/密码,并且它拒绝了我的连接尝试。

我倾向于后者。我的问题?我对托管服务的系统一无所知。我以我认为是 WCF 的常用机制的方式传递用户名/密码,但它不起作用。

所以,最后是问题:

我是否误导了自己,我确实需要弄乱 SSL 证书? 如果不是,我应该在 WCF 中做什么以将用户名/密码传递给由 MuleSoft 托管的 HTTPS Web 服务 ESB? (Mule EE Core Extensions/3.5.1,如果有帮助的话)。

【问题讨论】:

看起来服务证书不受信任。用浏览器检查url,看是否是可信证书 如果是证书的问题,为什么我在浏览器中查看.wsdl时看不到问题? 这就是我要求检查浏览器的原因。如果浏览器说证书没问题,那么问题应该出在应用程序端。打开 ssl 隧道是在客户端认证之前完成的,所以你应该专注于发现问题。 当我将 web 服务加载到浏览器中时,我看到 .wsdl,当我查看页面信息并查找证书时,我看到“此证书正常”。所以是的,看起来错误消息具有误导性。 只记得一个常见的问题。之间有代理吗? 【参考方案1】:

不确定我遇到的问题是否与您的问题有相同的原因,但以防万一我可以帮助某人解决此问题,添加 requireClientCertificate=true 解决了我的问题:

<bindings>
  <customBinding>
    <binding name="bindingName">
      ...
      <httpsTransport requireClientCertificate="true"/>
    </binding>
  </customBinding>
</bindings>

我收到了同样的错误消息,但我使用的 Web 服务是通过 HTTPS 进行的,并且需要 SSL 证书作为身份验证。

【讨论】:

【参考方案2】:

许多端点最近一直在禁用 TLSV1.0 和 TLSV1.1

尝试:

CURL https://&lt;&lt;service host&gt;&gt; -v -TLSV1.0

CURL https://&lt;&lt;service host&gt;&gt; -v -TLSV1.2

例如,https://www.comodo.com 不允许 TLSV1.0 或 TLSV1.1,但允许 TLSV1.2。

【讨论】:

以上是关于无法为具有权限“xxxxx.com”的 SSL/TLS 建立安全通道的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

无法为具有权限“apps.ika.gr”的 SSL/TLS 建立安全通道

即使文件具有 777 权限,LibreOffice 转换为 pdf 也会产生文件无法加载错误

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