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

问题描述 投票:17回答:9

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

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

无法为权限为“{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。

.net wcf web-services ssl https
9个回答
10
投票

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

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

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


23
投票

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

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

10
投票

问题

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

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

原来,第三方API的服务器需要TLS 1.2。要解决此问题,我将以下代码行添加到控制器的构造函数中:

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

3
投票

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


1
投票

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


1
投票

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

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服务的正确名称。


0
投票

这是为我修好的:

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

2)安装并运行winhttpcertcfg.exe以授予访问权限

https://msdn.microsoft.com/en-us/library/windows/desktop/aa384088(v=vs.85).aspx

该命令类似于以下内容:(输入您的证书主题和服务名称)

winhttpcertcfg -g -c LOCAL_MACHINE\MY -s "certificate subject" -a "NetworkService"
winhttpcertcfg -g -c LOCAL_MACHINE\MY -s "certificate subject" -a "LOCAL SERVICE"
winhttpcertcfg -g -c LOCAL_MACHINE\MY -s "certificate subject" -a "My Apps Service Account"

0
投票

与代码有相同的错误:

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

通过添加密码解决:

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

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站点。

© www.soinside.com 2019 - 2024. All rights reserved.