我必须使用具有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。
答案 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站点中。