Tro*_*ven 41 c# asp.net ssl iis-7.5 poodle-attack
我有一个C#PayTrace网关的问题.下面的代码工作正常,直到昨天我认为他们因为Poodle Exploit而关闭了SSL3.运行下面的代码时,我们得到以下消息.远程服务器已强制关闭连接.在对该问题进行一些研究后,我们确定由于我们的IIS Server 7.5配置为仍使用SSL3,因此C#默认为SSL3,PayTrace会强行关闭连接.然后,我们从服务器中删除了SSL3.然后导致以下错误:
客户端和服务器无法通信,因为它们没有通用算法.
我的猜测是,我们需要在服务器上安装额外的SSL算法,因为SSL 3已被删除.我们的IT人员声称TLS 1.1和TLS 1.2正在运行,ASP.NET现在应该默认为那些.但我觉得我们还需要在服务器上安装其他东西,我不了解SSL算法,所以我不知道从哪里开始.
var postUrl = new StringBuilder();
//Initialize url with configuration and parameter values...
postUrl.AppendFormat("UN~{0}|", this.MerchantLoginID);
postUrl.AppendFormat("PSWD~{0}|", this.MerchantTransactionKey);
postUrl.Append("TERMS~Y|METHOD~ProcessTranx|TRANXTYPE~Sale|");
postUrl.AppendFormat("CC~{0}|", cardNumber);
postUrl.AppendFormat("EXPMNTH~{0}|", expirationMonth.PadLeft(2, '0'));
postUrl.AppendFormat("EXPYR~{0}|", expirationYear);
postUrl.AppendFormat("AMOUNT~{0}|", transactionAmount);
postUrl.AppendFormat("BADDRESS~{0}|", this.AddressLine1);
postUrl.AppendFormat("BADDRESS2~{0}|", this.AddressLine2);
postUrl.AppendFormat("BCITY~{0}|", this.City);
postUrl.AppendFormat("BSTATE~{0}|", this.State);
postUrl.AppendFormat("BZIP~{0}|", this.Zip);
postUrl.AppendFormat("SADDRESS~{0}|", this.AddressLine1);
postUrl.AppendFormat("SADDRESS2~{0}|", this.AddressLine2);
postUrl.AppendFormat("SCITY~{0}|", this.City);
postUrl.AppendFormat("SSTATE~{0}|", this.State);
postUrl.AppendFormat("SZIP~{0}|", this.Zip);
if (!String.IsNullOrEmpty(this.Country))
{
postUrl.AppendFormat("BCOUNTRY~{0}|", this.Country);
}
if (!String.IsNullOrEmpty(this.Description))
{
postUrl.AppendFormat("DESCRIPTION~{0}|", this.Description);
}
if (!String.IsNullOrEmpty(this.InvoiceNumber))
{
postUrl.AppendFormat("INVOICE~{0}|", this.InvoiceNumber);
}
if (this.IsTestMode)
{
postUrl.AppendFormat("TEST~Y|");
}
//postUrl.Append();
WebClient wClient = new WebClient();
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
String sRequest = "PARMLIST=" + Url.Encode(postUrl.ToString());
wClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
string sResponse = "";
sResponse = wClient.UploadString(PayTraceUrl, sRequest);
Run Code Online (Sandbox Code Playgroud)
另外,仅仅是一个FYI,当我们连接到First Data E4网关时也会发生这个问题,因此它不仅仅是PayTrace的事情.我的猜测是,随着越来越多的网关关闭对SSL3的访问,我们将继续遇到其他网关的问题,直到可以在服务器上解决这个问题.另外,我确实在网上找到了一些建议,有些人建议在发出出站请求之前放置以下代码:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
Run Code Online (Sandbox Code Playgroud)
不幸的是,这也没有用,同样的错误.这就是为什么我认为需要在IIS7.5服务器上安装其他东西的原因.我只是不确定是什么.
Pau*_*aul 67
现在有几个关于此的帖子,它们都指向启用TLS 1.2.少一点是不安全的.
您可以在.NET 3.5中使用补丁执行此操作.
您可以使用一行代码在.NET 4.0和4.5中执行此操作
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // .NET 4.5
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; // .NET 4.0
Run Code Online (Sandbox Code Playgroud)
在.NET 4.6中,它自动使用TLS 1.2.
有关更多详细信息,请参见此处: .NET支持TLS
就我而言,我通过启用 .Net Framework 中的最新 TLS 版本解决了该问题,如本文所述:
https://learn.microsoft.com/dotnet/framework/network-programming/tls
设置这些注册表项:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319] "SystemDefaultTlsVersions"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319] "SystemDefaultTlsVersions"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319] "SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319] " SchUseStrongCrypto"=dword:00000001
Run Code Online (Sandbox Code Playgroud)
这已经解决了.事实证明我们的IT人员是正确的.TLS 1.1和TLS 1.2都安装在服务器上.但是,问题是我们的站点是作为ASP.NET 4.0运行的,您必须使用ASP.NET 4.5来运行TLS 1.1或TLS 1.2.因此,要解决此问题,我们的IT人员必须重新启用TLS 1.0才能与PayTrace建立连接.
简而言之,错误消息"客户端和服务器无法通信,因为它们没有通用算法",是因为服务器上没有可用于与PayTrace服务器通信的SSL协议.
小智 6
在先前的答案中,建议对.Net 4.5使用以下代码行:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // .NET 4.5
Run Code Online (Sandbox Code Playgroud)
我鼓励您将该值与任何现有值进行或运算:
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; // .NET 4.5
Run Code Online (Sandbox Code Playgroud)
如果查看值列表,则会发现它们是2的幂。这样,例如在将来将事情转移到TLS 2.0时,您的代码仍然可以使用。
小智 5
启用TLS 1.0也解决了我们的问题(禁用SSL v3后).(Server 2012 R2与ASP.net 4.0网站处理PPI付费服务).这是我用来按照我想要的方式设置所有内容的RegEdit脚本.我们只为客户端而不是服务器禁用了SSL v3,因为这样做打破了我们尚未准备好处理的其他事情.在我们将站点升级到.Net 4.5.2之后,我们将再次禁用TLS 1.0.
此脚本启用除客户端的SSL v3之外的所有协议,服务器和客户端.
-Eric Niemiec
(务必备份您的注册表!!)
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client]
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server]
"Enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"Enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"DisabledByDefault"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"Enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"DisabledByDefault"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"Enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"DisabledByDefault"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"Enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"DisabledByDefault"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"Enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"Enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"DisabledByDefault"=dword:00000000
Run Code Online (Sandbox Code Playgroud)
就我而言,即使Project的Target Framework是4.7.1,我仍然遇到相同的错误,解决方案是将system.web下web.config中的httpRuntime更改为4.7.1!
小智 5
我的应用程序在 .net 4.7.2 中运行。最简单的解决方案是将其添加到配置中:
<system.web>
<httpRuntime targetFramework="4.7.2"/>
</system.web>
Run Code Online (Sandbox Code Playgroud)
有两种可能的情况,就我而言,我使用了第二点。
如果您在生产环境中遇到此问题,并且可以轻松地将新代码部署到生产环境中,那么您可以使用以下解决方案。
您可以在进行 api 调用之前添加以下代码行,
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // .NET 4.5
如果您无法部署新代码,并且希望使用生产中存在的相同代码来解决,则可以通过更改一些配置设置文件来解决此问题。您可以在配置文件中添加任何一个。
<runtime>
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false"/>
</runtime>
Run Code Online (Sandbox Code Playgroud)
或者
<runtime>
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=false"
</runtime>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
118906 次 |
最近记录: |