WCF/SOAP .NET 4.6.1 和 TLS 1.0 服务器中的客户端:缺少客户端问候
WCF/SOAP client in .NET 4.6.1 and TLS 1.0 server: client hello missing
我很难为以下情况找到解决方案:
- 我们在 Java 中创建了遗留 SOAP 服务,对此我们没有任何合理的方法 upgrade/modify。此遗留服务可使用 https 端点访问,并且仅支持 TLS 1.0
- 我们在注册表中配置了 SCHANNEL 以启用 tls 1.0
- 我们在注册表中也启用了强加密,但我想它不会造成伤害,因为它只会禁用 SSL3?
- 我们能够使用网络浏览器正确到达此端点
- 我们能够使用以下 powershell 脚本确认 TLS 1.0 已启用:
$RetValue = New-Object psobject -Property @{
Host = $HostName
Port = $Port
SSLv2 = $false
SSLv3 = $false
TLSv1_0 = $false
TLSv1_1 = $false
TLSv1_2 = $false
KeyExhange = $null
HashAlgorithm = $null
}
"ssl2", "ssl3", "tls", "tls11", "tls12" | %{
$TcpClient = New-Object Net.Sockets.TcpClient
$TcpClient.Connect($RetValue.Host, $RetValue.Port)
$SslStream = New-Object Net.Security.SslStream $TcpClient.GetStream()
$SslStream.ReadTimeout = 15000
$SslStream.WriteTimeout = 15000
try {
$SslStream.AuthenticateAsClient($RetValue.Host,$null,$_,$false)
$RetValue.KeyExhange = $SslStream.KeyExchangeAlgorithm
$RetValue.HashAlgorithm = $SslStream.HashAlgorithm
$status = $true
} catch {
$status = $false
}
switch ($_) {
"ssl2" {$RetValue.SSLv2 = $status}
"ssl3" {$RetValue.SSLv3 = $status}
"tls" {$RetValue.TLSv1_0 = $status}
"tls11" {$RetValue.TLSv1_1 = $status}
"tls12" {$RetValue.TLSv1_2 = $status}
}
}
$RetValue
"From "+ $TcpClient.client.LocalEndPoint.address.IPAddressToString +" to $hostname "+ $TcpClient.client.RemoteEndPoint.address.IPAddressToString +':'+$TcpClient.client.RemoteEndPoint.port
$SslStream | gm | ? {$_.MemberType -match 'Property'} | Select-Object Name | % {$_.Name +': '+ $sslStream.($_.name)}
但是,我们无法使用 .NET 4.6.1 WCF 客户端应用程序连接到此终结点。当我们检查 wireshark 连接时发现,对于 TLS 1.2,执行了正确的握手协议(并且失败,这是预期的),但是没有用于 TLS 1.0 握手的 CLIENT HELLO。只有空的 TCP 连接和下一个 - 连接重置。
我们正在使用 BasicHttpsBinding
并强制 TLS 客户端:ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 ;
有人可以建议,我在代码或服务器配置中遗漏了什么可能会阻止 WCF 客户端启动此连接吗?
好的,看来答案很简单。代码一切正常,问题出在非常旧版本的 WebLogic 上,它不仅不支持高于 1.0 的 tls,而且 - 无法正确处理更高的 TLS 握手。唯一的解决方法是创建一个反向代理,它在更高的 TLS 上接收流量并仅在 TLS 1.0 上将其转发到目标 weblogic。
我很难为以下情况找到解决方案:
- 我们在 Java 中创建了遗留 SOAP 服务,对此我们没有任何合理的方法 upgrade/modify。此遗留服务可使用 https 端点访问,并且仅支持 TLS 1.0
- 我们在注册表中配置了 SCHANNEL 以启用 tls 1.0
- 我们在注册表中也启用了强加密,但我想它不会造成伤害,因为它只会禁用 SSL3?
- 我们能够使用网络浏览器正确到达此端点
- 我们能够使用以下 powershell 脚本确认 TLS 1.0 已启用:
$RetValue = New-Object psobject -Property @{
Host = $HostName
Port = $Port
SSLv2 = $false
SSLv3 = $false
TLSv1_0 = $false
TLSv1_1 = $false
TLSv1_2 = $false
KeyExhange = $null
HashAlgorithm = $null
}
"ssl2", "ssl3", "tls", "tls11", "tls12" | %{
$TcpClient = New-Object Net.Sockets.TcpClient
$TcpClient.Connect($RetValue.Host, $RetValue.Port)
$SslStream = New-Object Net.Security.SslStream $TcpClient.GetStream()
$SslStream.ReadTimeout = 15000
$SslStream.WriteTimeout = 15000
try {
$SslStream.AuthenticateAsClient($RetValue.Host,$null,$_,$false)
$RetValue.KeyExhange = $SslStream.KeyExchangeAlgorithm
$RetValue.HashAlgorithm = $SslStream.HashAlgorithm
$status = $true
} catch {
$status = $false
}
switch ($_) {
"ssl2" {$RetValue.SSLv2 = $status}
"ssl3" {$RetValue.SSLv3 = $status}
"tls" {$RetValue.TLSv1_0 = $status}
"tls11" {$RetValue.TLSv1_1 = $status}
"tls12" {$RetValue.TLSv1_2 = $status}
}
}
$RetValue
"From "+ $TcpClient.client.LocalEndPoint.address.IPAddressToString +" to $hostname "+ $TcpClient.client.RemoteEndPoint.address.IPAddressToString +':'+$TcpClient.client.RemoteEndPoint.port
$SslStream | gm | ? {$_.MemberType -match 'Property'} | Select-Object Name | % {$_.Name +': '+ $sslStream.($_.name)}
但是,我们无法使用 .NET 4.6.1 WCF 客户端应用程序连接到此终结点。当我们检查 wireshark 连接时发现,对于 TLS 1.2,执行了正确的握手协议(并且失败,这是预期的),但是没有用于 TLS 1.0 握手的 CLIENT HELLO。只有空的 TCP 连接和下一个 - 连接重置。
我们正在使用 BasicHttpsBinding
并强制 TLS 客户端:ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 ;
有人可以建议,我在代码或服务器配置中遗漏了什么可能会阻止 WCF 客户端启动此连接吗?
好的,看来答案很简单。代码一切正常,问题出在非常旧版本的 WebLogic 上,它不仅不支持高于 1.0 的 tls,而且 - 无法正确处理更高的 TLS 握手。唯一的解决方法是创建一个反向代理,它在更高的 TLS 上接收流量并仅在 TLS 1.0 上将其转发到目标 weblogic。