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

我很难为以下情况找到解决方案:

        $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。