我很难找到以下情况的解决方案:
- 我们有用 Java 创建的遗留 SOAP 服务,我们没有任何合理的方式来升级/修改。此旧服务可使用 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 客户端启动此连接吗?