我必须使用具有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。
是的,不受信任的证书可能导致此问题。通过在浏览器中打开websservice并使用浏览器工具查看证书路径,查看Web服务的证书路径。您可能需要在调用Web服务的计算机上安装一个或多个中间证书。在浏览器中,当您进一步调查时,您可能会看到“证书错误”并带有“安装证书”选项 - 这可能是您缺少的证书。
我的特殊问题是2010年7月升级到根服务器后遗失的Geotrust Geotrust DV SSL CA中间证书
https://knowledge.geotrust.com/support/knowledge-base/index?page=content&id=AR1422
这正是我面临的问题。在另一篇文章中,我得到了一个改变配置的提示。对我来说,这有效:
<bindings>
<basicHttpBinding>
<binding name="xxxBinding">
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
问题
从ASP.NET核心MVC项目调用第三方API时,我遇到了同样的错误消息。
无法为权限为“{base_url_of_WS}”的SSL / TLS建立安全通道。
解
原来,第三方API的服务器需要TLS 1.2。要解决此问题,我将以下代码行添加到控制器的构造函数中:
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
我们在.aspx页面调用web服务的新Web服务器上遇到了这个问题。我们没有向应用程序池用户授予计算机证书的权限。在我们向应用程序池用户授予权限后,问题已得到解决。
确保以管理员身份运行Visual Studio。
如果它帮助其他任何人,使用新的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服务的正确名称。
这是为我修好的:
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"
与代码有相同的错误:
X509Certificate2 mycert = new X509Certificate2(@"C:\certificate.crt");
通过添加密码解决:
X509Certificate2 mycert = new X509Certificate2(@"C:\certificate.crt", "password");
这个错误可能由于很多原因而发生,最后一次,我通过修改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站点。