WCF WF 服务,无法为具有权限的 SSL/TLS 建立安全通道
WCF WF Service, Could not establish secure channel for SSL/TLS with authority
我在尝试访问我的 WCF WF 服务时不断收到相同的错误:"Could not establish secure channel for SSL/TLS with authority."
我已经尝试了一堆 Whosebug/google 解决方案,但到目前为止没有运气。
我制作了一个 WCF WF 服务,该服务连接到使用证书进行验证的第三方。我的 Web.config 看起来像这样:
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
</appSettings>
<system.web>
<compilation debug="true" strict="false" explicit="true"
targetFramework="4.5.1"/>
<httpRuntime targetFramework="4.5.1"/>
</system.web>
<system.serviceModel>
<bindings>
<basicHttpsBinding>
<binding name="binding1">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpsBinding>
</bindings>
<client>
<!-- Test Endpoint -->
<endpoint address="https://example.com"
behaviorConfiguration="endpointBehavior"
binding="basicHttpsBinding"
bindingConfiguration="binding1"
contract="ContractPortType"
name="Port">
</endpoint>
</client>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="endpointBehavior">
<clientCredentials>
<clientCertificate findValue="SOMETHUMBPRINT"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindByThumbprint" />
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https"/>
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true"
minFreeMemoryPercentageToActivateService="1"/>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
客户端只是一个简单的控制台运行这个:
using (var client = new ServiceClient())
{
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
var msg = client.GetData();
Console.WriteLine(msg);
}
即有以下App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService"/>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:55670/GetData.xamlx"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService"
contract="Reference.IService" name="BasicHttpBinding_IService" behaviorConfiguration="endpointBehavior" />
</client>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="endpointBehavior">
<clientCredentials>
<clientCertificate findValue="SOMETHUMBPRINT"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindByThumbprint" />
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
如果有人能帮助我,那就太好了。
编辑:
所以我似乎无法工作的是我的 WCF WF 服务和第三方服务之间所需的 SSL 连接。当我直接从客户端调用第三方服务时,我可以设置 System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
但我找不到对我的 WCF WF 服务执行相同操作的方法。
编辑:
所以我可以通过创建一个 activity 然后在我调用第三方 activity 之前调用它 activity 来让它工作,然后它工作,但必须有更好的方法!
public sealed class SetTlsVersion : CodeActivity
{
protected override void Execute(CodeActivityContext context)
{
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
}
}
我 运行 今年早些时候遇到过类似的问题,结果发现一些 SSL 证书使用 TLS 1.2。
.NET 4.5 默认 TLS 版本为 v1.1。这可以通过以下代码片段在您的代码中更改:
using System.Net;
// ...
// In your application startup flow, set the security protocol to TLS 1.2.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
理想情况下,应在应用程序启动时调用上述内容。之后,我想你就可以走了。
旁注: .NET 4.0 目标应用程序将需要稍微不同的技巧来设置 TLS 版本:
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
并且在 .NET 3.5 和更低版本 中,不幸的是甚至不支持 TLS 1.2。但在您的情况下,您的目标似乎是 .NET 4.5,因此您可以在这方面继续努力。
编辑:我注意到在您的客户端代码片段中您对 TLS 版本进行了按位或运算,这是不正确的。它应该是单个值,在本例中为 SecurityProtocolType.Tls12
。
我假设底层 .NET Framework 网络代码最终只使用了 SecurityProtocolType.Tls
,这与 SSL/TLS 证书支持的内容不匹配。
希望对您有所帮助。
好吧,我能够做到这一点的唯一方法是使用 HttpModule(感谢 ajawad987 提供的提示)。我仍然相信这只能(或应该)在 Web.config 中完成。
public class InitializerModule : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication context)
{
// Sets the TLS version for every request made to an external party
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
}
}
Web.config
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="InitializerModule" type="WorkflowService.Helpers.InitializerModule"/>
</modules>
</system.webServer>
我在尝试访问我的 WCF WF 服务时不断收到相同的错误:"Could not establish secure channel for SSL/TLS with authority."
我已经尝试了一堆 Whosebug/google 解决方案,但到目前为止没有运气。
我制作了一个 WCF WF 服务,该服务连接到使用证书进行验证的第三方。我的 Web.config 看起来像这样:
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
</appSettings>
<system.web>
<compilation debug="true" strict="false" explicit="true"
targetFramework="4.5.1"/>
<httpRuntime targetFramework="4.5.1"/>
</system.web>
<system.serviceModel>
<bindings>
<basicHttpsBinding>
<binding name="binding1">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpsBinding>
</bindings>
<client>
<!-- Test Endpoint -->
<endpoint address="https://example.com"
behaviorConfiguration="endpointBehavior"
binding="basicHttpsBinding"
bindingConfiguration="binding1"
contract="ContractPortType"
name="Port">
</endpoint>
</client>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="endpointBehavior">
<clientCredentials>
<clientCertificate findValue="SOMETHUMBPRINT"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindByThumbprint" />
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https"/>
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true"
minFreeMemoryPercentageToActivateService="1"/>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
客户端只是一个简单的控制台运行这个:
using (var client = new ServiceClient())
{
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
var msg = client.GetData();
Console.WriteLine(msg);
}
即有以下App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService"/>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:55670/GetData.xamlx"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService"
contract="Reference.IService" name="BasicHttpBinding_IService" behaviorConfiguration="endpointBehavior" />
</client>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="endpointBehavior">
<clientCredentials>
<clientCertificate findValue="SOMETHUMBPRINT"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindByThumbprint" />
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
如果有人能帮助我,那就太好了。
编辑: 所以我似乎无法工作的是我的 WCF WF 服务和第三方服务之间所需的 SSL 连接。当我直接从客户端调用第三方服务时,我可以设置 System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 但我找不到对我的 WCF WF 服务执行相同操作的方法。
编辑: 所以我可以通过创建一个 activity 然后在我调用第三方 activity 之前调用它 activity 来让它工作,然后它工作,但必须有更好的方法!
public sealed class SetTlsVersion : CodeActivity
{
protected override void Execute(CodeActivityContext context)
{
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
}
}
我 运行 今年早些时候遇到过类似的问题,结果发现一些 SSL 证书使用 TLS 1.2。
.NET 4.5 默认 TLS 版本为 v1.1。这可以通过以下代码片段在您的代码中更改:
using System.Net;
// ...
// In your application startup flow, set the security protocol to TLS 1.2.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
理想情况下,应在应用程序启动时调用上述内容。之后,我想你就可以走了。
旁注: .NET 4.0 目标应用程序将需要稍微不同的技巧来设置 TLS 版本:
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
并且在 .NET 3.5 和更低版本 中,不幸的是甚至不支持 TLS 1.2。但在您的情况下,您的目标似乎是 .NET 4.5,因此您可以在这方面继续努力。
编辑:我注意到在您的客户端代码片段中您对 TLS 版本进行了按位或运算,这是不正确的。它应该是单个值,在本例中为 SecurityProtocolType.Tls12
。
我假设底层 .NET Framework 网络代码最终只使用了 SecurityProtocolType.Tls
,这与 SSL/TLS 证书支持的内容不匹配。
希望对您有所帮助。
好吧,我能够做到这一点的唯一方法是使用 HttpModule(感谢 ajawad987 提供的提示)。我仍然相信这只能(或应该)在 Web.config 中完成。
public class InitializerModule : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication context)
{
// Sets the TLS version for every request made to an external party
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
}
}
Web.config
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="InitializerModule" type="WorkflowService.Helpers.InitializerModule"/>
</modules>
</system.webServer>