无法满足安全令牌请求,因为关闭TLS 1.0时身份验证失败

时间:2017-11-22 15:42:42

标签: c# .net wcf

所以我试图在我的服务器上关闭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时这不起作用?

1 个答案:

答案 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 levelin 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,并始终使用最强的协议。

我希望这有帮助!