gpt4 book ai didi

c# - 无法满足安全 token 请求,因为关闭 TLS 1.0 时身份验证失败

转载 作者:太空狗 更新时间:2023-10-29 19:43:35 25 4
gpt4 key购买 nike

所以我试图在我的服务器上关闭 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 协议(protocol),因此根据我的阅读,它将自动检测需要哪种 TLS 协议(protocol)此版本的 .net 框架中的运行时。

WCF 服务的 Web.config 关于绑定(bind)如下

调用配置:

<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 时这不起作用?

最佳答案

如您所知,问题是 SSL3 和 TLS1.0 容易受到 POODLE 的攻击。攻击,和other threads .因此,迁移到支持 TLS 1.1 and TLS 1.2 的 .NET 4.5 , 或以上是个好主意。

基本上,客户端会与服务器协商并采用服务器提供的最高协议(protocol)。只要服务器提供 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 应用程序中的协议(protocol),如下所示(并且已经这样做):

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,您需要设置 SecurityProtocol(使用 SslProtocols Enumeration 或相应的整数值)在任何 WebRequest 调用之前(实际上,这有每个 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 .所以,你应该没问题。

但是,值得检查一下 TLS 1.2 是否在 OS level 处启用。和 in the registry (这也会影响 IIS (7.x) 、SQL Server (2012)、Reporting Services 等,具体取决于构建版本)。默认安全协议(protocol)取决于以下注册表项。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319: SchUseStrongCrypto to DWORD 1

检查注册表项“SchUseStrongCrypto”是否设置为 1。这将强制 .NET 应用避免使用 SSL3.0 或 TLS1.0,并始终使用可用的最强协议(protocol)。

希望对您有所帮助!

关于c# - 无法满足安全 token 请求,因为关闭 TLS 1.0 时身份验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47438697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com