所以我试图在我的服务器上关闭TLS 1.0和1.1。当我关闭TLS 1.0时,我的应用程序出现以下错误:
System.ServiceModel.Security.SecurityNegotiationException: The caller was not authenticated by the service. ---> System.ServiceModel.FaultException: The request for security token could not be satisfied because authentication failed.
at System.ServiceModel.Security.SecurityUtils.ThrowIfNegotiationFault(Message message, EndpointAddress target)
at System.ServiceModel.Security.SspiNegotiationTokenProvider.GetNextOutgoingMessageBody(Message incomingMessage, SspiNegotiationTokenProviderState sspiState)
启用TLS 1.0后一切正常。
现在,调用服务的代码使用ServicePointManager
使用以下代码指定TLS 1.2:ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
另一端的服务正在运行.Net 4.6.2并且未使用ServicePointManager
指定TLS协议,因此根据我的阅读,它将自动检测运行时需要哪个TLS协议.net框架的版本。
关于绑定
,WCF服务的Web.config如下所示致电配置:
<basicHttpBinding>
<binding name="MyBinding" closeTimeout="00:02:00" openTimeout="00:02:00" receiveTimeout="00:02:00" sendTimeout="00:02:00"/>
</basicHttpBinding>
<netTcpBinding>
<binding name="CrossDomainBinding">
<security mode="Message">
<message clientCredentialType="Certificate"/>
</security>
</binding>
</netTcpBinding>
<client>
<endpoint address="net.tcp://MyService.svc"
binding="netTcpBinding" bindingConfiguration="CrossDomainBinding" behaviorConfiguration="CrossDomainBehavior"
contract="MyContract" name="MyBinding">
<identity>
<certificate encodedValue="CERTIFICATEENCODEDVALUE" />
</identity>
</endpoint>
</client>
服务配置:
<bindings>
<netTcpBinding>
<binding>
<security mode="Message">
<message clientCredentialType="Certificate"/>
</security>
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="MyBehaviour">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="false"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceCredentials>
<serviceCertificate findValue="MyCertificate" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
我不能为我的生活解决这里的问题。
有没有人知道为什么在关闭TLS 1.0时这不起作用?
答案 0 :(得分:3)
如您所知,问题是SSL3和TLS1.0易受POODLE攻击,other threads。因此,迁移到支持TLS 1.1 and TLS 1.2或更高版本的.NET 4.5是一个好主意。
基本上,客户端将与服务器协商并采用服务器提供的最高协议。只要服务器提供TLS 1.1或TLS 1.2,客户端将使用TLS 1.1或1.2。
如果您的应用是.NET 4.0,您仍然可以通过在服务器上安装.NET 4.5来使用TLS 1.2。您的应用程序不必重新定位到.NET 4.5。您可以在.NET 4.0应用程序中强制更改协议,如下所示(并且已经执行):
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;//SecurityProtocolType.Tls1.2;
一个警告只是升级到.NET 4.5并不能自动解决问题。这是因为default protocol is SSL3/TLS1.0 in .NET 4.0 / 4.5。因此,为了在.NET 4.5+中使用TLS 1.2或TLS 1.1,您需要在任何 WebRequest调用之前设置SecurityProtocol(使用SslProtocols Enumeration或相应的整数值)(实际上,每个AppDomain只需执行一次。但是再次设置它并没有什么坏处。
首先,TLS在Windows中由名为SChannel的组件终止。支持的密码取决于SChannel的版本,这取决于操作系统,而不依赖于.NET版本;例如Windows XP仅支持TLS 1.0。 Ref。
自Windows Server 2012 and Windows 8.1 TLS 1.2 is enabled by default以来。所以,你应该没事。
但是,值得检查是否在OS level和in the registry启用了TLS 1.2(这也会影响IIS (7.x),SQL Server(2012),Reporting Services等。取决于构建版本)。默认安全协议取决于以下注册表项。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319: SchUseStrongCrypto to DWORD 1
检查注册表项“SchUseStrongCrypto”是否设置为1.这将强制.NET应用程序避免使用SSL3.0或TLS1.0,并始终使用最强的协议。
我希望这有帮助!