无法为具有权限'*'的SSL / TLS建立安全通道

时间:2010-12-16 17:14:32

标签: .net wcf web-services ssl https

我必须使用具有SSL证书的PHP Web服务。我的.net 3.5类库引用了VisualStudio 2010中的“添加服务引用”的Web服务(WCF对吧?)。

在调用我收到的网络服务的主要方法时;

无法为权限为“{base_url_of_WS}”的SSL / TLS建立安全通道。

我尝试了很多,比如

System.Net.ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); 
 public bool CheckValidationResult(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        return true;
    }

但这不会奏效。我也在自己的机器上安装了证书。

*额外信息;当我在“添加服务引用”中使用wsdl位置时,会发生同样的错误。在我尝试之前,我使用静态wsdl。

alt text

8 个答案:

答案 0 :(得分:23)

这正是我面临的问题。在另一篇文章中,我得到了一个改变配置的提示。对我来说这很有效:

<bindings>
  <basicHttpBinding>
    <binding name="xxxBinding">
      <security mode="Transport">
        <transport clientCredentialType="Certificate"/>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

答案 1 :(得分:10)

是的,不受信任的证书可能会导致此问题。通过在浏览器中打开websservice并使用浏览器工具查看证书路径,查看Web服务的证书路径。您可能需要在调用Web服务的计算机上安装一个或多个中间证书。在浏览器中,当您进一步调查时,您可能会看到“证书错误”并带有“安装证书”选项 - 这可能是您缺少的证书。

我的特殊问题是2010年7月升级到根服务器后遗失了Geotrust Geotrust DV SSL CA中间证书

https://knowledge.geotrust.com/support/knowledge-base/index?page=content&id=AR1422

答案 2 :(得分:10)

问题

从ASP.NET Core MVC项目调用第三方API时,我遇到了同样的错误消息。

  

无法使用权​​限建立SSL / TLS的安全通道   “ {base_url_of_WS}”。

解决方案

事实证明,第三方API的服务器需要TLS 1.2。为了解决此问题,我在控制器的构造函数中添加了以下代码行:

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

答案 3 :(得分:3)

我们在来自.aspx页面的新网络服务器上调用了一个Web服务。我们没有向应用程序池用户授予计算机证书的权限。在我们向应用程序池用户授予权限后,问题已得到解决。

答案 4 :(得分:1)

确保以管理员身份运行Visual Studio。

答案 5 :(得分:1)

如果它帮助其他人,使用适用于.NET Standard和.NET Core的新Microsoft Web Service Reference Provider tool,我必须将以下行添加到绑定定义中,如下所示:

binding.Security.Mode = BasicHttpSecurityMode.Transport;
binding.Security.Transport = new HttpTransportSecurity{ClientCredentialType = HttpClientCredentialType.Certificate};

这实际上与Micha的答案相同,但在代码中没有配置文件。

因此,为了将绑定与Web服务的实例化结合起来,我做了这个:

 System.ServiceModel.BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();
 binding.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.Transport;
 binding.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Certificate;
 var client = new WebServiceClient(binding, GetWebServiceEndpointAddress());

其中WebServiceClient是您定义的Web服务的正确名称。

答案 6 :(得分:0)

代码有同样的错误:

X509Certificate2 mycert = new X509Certificate2(@"C:\certificate.crt");

通过添加密码解决:

X509Certificate2 mycert = new X509Certificate2(@"C:\certificate.crt", "password");

答案 7 :(得分:0)

此错误的发生可能有多种原因,最后一次,我通过修改Reference.svcmap文件并更改了WSDL文件的引用方式来解决了该问题。

抛出异常:

<MetadataSource Address="C:\Users\Me\Repo\Service.wsdl" Protocol="file" SourceId="1" />
<MetadataFile FileName="Service.wsdl" ... SourceUrl="file:///C:/Users/Me/Repo/Service.wsdl" />

工作正常:

<MetadataSource Address="https://server.domain/path/Service.wsdl" Protocol="http" SourceId="1" />
<MetadataFile FileName="Service.wsdl" ... SourceUrl="https://server.domain/path/Service.wsdl" />

这似乎很奇怪,但我已将其复制。这在.NET 4.5和4.7上的控制台应用程序中,以及在4.7中的.NET WebAPI站点中。