我遇到了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);
另外,仅仅是一个FYI,当我们连接到First Data E4网关时,这个问题也会发生,因此它不仅仅是PayTrace的事情。我的猜测是,随着越来越多的网关关闭对SSL3的访问,我们将继续遇到其他网关的问题,直到可以在服务器上解决这个问题。另外,我确实在网上找到了一些建议,有些人建议在发出出站请求之前放置以下代码:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
不幸的是,这也没有用,同样的错误。这就是为什么我认为需要在IIS7.5服务器上安装其他东西的原因。我只是不确定是什么。
答案 0 :(得分:56)
现在有几个关于此的帖子,它们都指向启用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
在.NET 4.6中,它自动使用TLS 1.2。
请点击此处了解更多详情: .NET support for TLS
答案 1 :(得分:7)
这已经解决了。事实证明我们的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建立连接。
简而言之,错误信息"客户端和服务器无法通信,因为它们没有共同的算法",原因是服务器上没有可用的SSL协议与PayTrace通信#39;服务器。
答案 2 :(得分: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
答案 3 :(得分:5)
在先前的答案中,建议对.Net 4.5使用以下代码行:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // .NET 4.5
我鼓励您将该值与任何现有值进行或运算:
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; // .NET 4.5
如果查看值列表,则会发现它们是2的幂。这样,例如在将来将事情转移到TLS 2.0时,您的代码仍然可以使用。
答案 4 :(得分:4)
就我而言,即使Project的Target Framework是4.7.1,我仍然遇到相同的错误,解决方案是将system.web下web.config中的httpRuntime更改为4.7.1!
答案 5 :(得分:2)
我的应用程序在.net 4.7.2中运行。最简单的解决方案是将其添加到配置中:
<system.web>
<httpRuntime targetFramework="4.7.2"/>
</system.web>
答案 6 :(得分:2)
有两种可能的情况,在我的情况下,我使用第二点。
如果您在生产环境中遇到此问题,并且可以轻松地将新代码部署到生产中,则可以使用以下解决方案。
您可以在进行api调用之前添加以下代码行,
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // .NET 4.5
如果无法部署新代码,并且想要使用生产环境中存在的相同代码进行解析,则可以通过更改某些配置设置文件来解决此问题。 您可以在配置文件中添加任何一个。
<runtime>
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false"/>
</runtime>
或
<runtime>
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=false"
</runtime>
答案 7 :(得分:1)
我通过将应用程序从.Net Framework 4.5升级到4.6.2来解决此错误。
TLS-1.2已正确安装在服务器上,并且禁用了TLS-1.1之类的旧版本。但是,.Net 4.5不支持TLS-1.2。
答案 8 :(得分:1)
您需要检查与此相关的几件事。
每当出现与建立安全连接相关的此类错误时,请尝试在 Powershell 中使用机器名称或 uri(如“www.google.com”)运行如下脚本以获取结果返回每个不同的协议类型:
function Test-SocketSslProtocols {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)][string]$ComputerName,
[int]$Port = 443,
[string[]]$ProtocolNames = $null
)
#set results list
$ProtocolStatusObjArr = [System.Collections.ArrayList]@()
if($ProtocolNames -eq $null){
#if parameter $ProtocolNames empty get system list
$ProtocolNames = [System.Security.Authentication.SslProtocols] | Get-Member -Static -MemberType Property | Where-Object { $_.Name -notin @("Default", "None") } | ForEach-Object { $_.Name }
}
foreach($ProtocolName in $ProtocolNames){
#create and connect socket
#use default port 443 unless defined otherwise
#if the port specified is not listening it will throw in error
#ensure listening port is a tls exposed port
$Socket = New-Object System.Net.Sockets.Socket([System.Net.Sockets.SocketType]::Stream, [System.Net.Sockets.ProtocolType]::Tcp)
$Socket.Connect($ComputerName, $Port)
#initialize default obj
$ProtocolStatusObj = [PSCustomObject]@{
Computer = $ComputerName
Port = $Port
ProtocolName = $ProtocolName
IsActive = $false
KeySize = $null
SignatureAlgorithm = $null
Certificate = $null
}
try {
#create netstream
$NetStream = New-Object System.Net.Sockets.NetworkStream($Socket, $true)
#wrap stream in security sslstream
$SslStream = New-Object System.Net.Security.SslStream($NetStream, $true)
$SslStream.AuthenticateAsClient($ComputerName, $null, $ProtocolName, $false)
$RemoteCertificate = [System.Security.Cryptography.X509Certificates.X509Certificate2]$SslStream.RemoteCertificate
$ProtocolStatusObj.IsActive = $true
$ProtocolStatusObj.KeySize = $RemoteCertificate.PublicKey.Key.KeySize
$ProtocolStatusObj.SignatureAlgorithm = $RemoteCertificate.SignatureAlgorithm.FriendlyName
$ProtocolStatusObj.Certificate = $RemoteCertificate
}
catch {
$ProtocolStatusObj.IsActive = $false
Write-Error "Failure to connect to machine $ComputerName using protocol: $ProtocolName."
Write-Error $_
}
finally {
$SslStream.Close()
}
[void]$ProtocolStatusObjArr.Add($ProtocolStatusObj)
}
Write-Output $ProtocolStatusObjArr
}
Test-SocketSslProtocols -ComputerName "www.google.com"
它将尝试建立套接字连接并为每次尝试和成功连接返回完整的对象。
看到返回的内容后,通过regedit检查您的计算机注册表(运行“regedit”或查找“注册表编辑器”),放置
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL
在文件路径中,并确保为您尝试连接的任何服务器启用了适当的 TLS 协议(根据您从脚本返回的结果)。根据需要进行调整,然后重置您的计算机(这是必需的)。再次尝试连接 powershell 脚本,看看你得到什么结果。如果仍然不成功,请确保需要启用的算法、散列和密码正在缩小需要启用的范围(IISCrypto 是一个很好的应用程序,可以免费使用。它会给你一个实时视图在所有这些东西所在的 SChannel 注册表中启用或禁用)。
还要记住您当前安装的 Windows 版本、DotNet 版本和更新,因为尽管在 Windows 10 中默认启用了许多 TLS 选项,但以前的版本需要补丁才能启用该选项。
最后一件事:TLS 是一条双向的街道(请记住这一点),其想法是服务器提供可用的东西与客户端一样重要。如果服务器仅提供使用某些算法通过 TLS 1.2 进行连接,则客户端将无法与其他任何连接。此外,如果客户端不连接特定协议或密码套件以外的任何其他内容,则连接将无法工作。浏览器也需要考虑到这一点,因为它们会在 HTTP2 上强制错误执行任何低于 TLS 1.2 的操作,尽管实际上并没有错误(他们抛出它是为了尝试让人们升级,但注册表设置确实存在以修改此行为)。
答案 9 :(得分:0)
经过几天的捣乱,我对问题的最终解决需要两件事;
1)我们将这行代码添加到我们的所有.Net库中,这些库对已禁用SSL v3的其他供应商进行绑定api调用。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls; // (.Net 4 and below)
2)这是运行ASP.Net 4.0站点时需要进行的最终和完整的注册表更改,并且在升级到ASP.Net 4.5后需要稍作更改。
我们重新启动服务器后 - 所有问题都在此之后消失了。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client]
"DisabledByDefault"=dword:00000001
[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]
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server]
"Enabled"=dword:00000000
[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
答案 10 :(得分:0)
在先前的答案中,缺少了一些可能不存在的注册表项。 它们是SchUseStrongCrypto,必须存在以允许TLS协议正常工作。
将注册表项导入注册表后,无需更改
之类的代码ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
下面是x64 Windows OS所需的所有注册表项和值。 如果您使用的是32位操作系统(x86),则只需删除最后两行。 注册表脚本将禁用TLS 1.0。 需要重启操作系统。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"DisabledByDefault"=dword:00000001
"enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\server]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\ssl 3.0]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\ssl 3.0\client]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\ssl 3.0\server]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.0]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.0\client]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.0\server]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.1]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.1\client]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.1\server]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.2]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.2\client]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.2\server]
"disabledbydefault"=dword:00000000
"enabled"=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