当前位置: 首页 > 知识库问答 >
问题:

TLS致命:握手失败

鲁明知
2023-03-14

我需要与外部服务连接,而且我的客户端身份验证有问题。该服务需要证书、用户名和密码以及请求。

我正在使用Windows Server 2008 R2。

我已经收到带有证书的PKCS#7包并导入:

  • 本地计算机/个人的SSL证书(仅含公钥)
  • 中间CA和根CA到本地计算机/受信任的RootCertificationAuthorities

我已经在Windows注册表中启用了TLS 1.0、1.1、1.2客户端:Windows注册表

我正在尝试使用WCF客户端和web浏览器(IE和Chrome)连接到服务器。

WCF客户端(.NET 4.6.1):

应用程序。配置:

<bindings>     
    <wsHttpBinding>
        <binding name="WSHttpBinding_ICalculator" >
            <security mode="Transport">
                <transport clientCredentialType="Certificate" />
            </security>
        </binding>
    </wsHttpBinding>
</bindings>
<behaviors>
    <endpointBehaviors>
        <behavior name="endpointCredentialBehavior">
            <clientCredentials>
                <clientCertificate findValue="<thumbprint>"
                           storeLocation="LocalMachine"
                           storeName="My"
                           x509FindType="FindByThumbprint" />
            </clientCredentials>
        </behavior>
    </endpointBehaviors>
</behaviors>

程序反恐精英:

ServicePointManager.Expect100Continue = true;

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
           | SecurityProtocolType.Tls11
           | SecurityProtocolType.Tls12;

using (var client = new ServiceClient())
{
    client.ClientCredentials.UserName.UserName = "username";
    client.ClientCredentials.UserName.Password = "pwd";

    client.Open();
    var response = client.DoSth();
}

我得到一个错误:

“无法为具有权限的SSL/TLS建立安全通道…”。

Internet Explorer显示:IE错误

Chrome显示:Chrome错误

我还试图通过Wireshark进行调试。对我来说,怀疑来自客户端的“证书”消息不包含任何证书(无论是使用WCF客户端还是web浏览器)。是否应在此处添加证书?如果是,是什么原因导致证书出现问题?

Wireshark包

我知道在stackoverflow和Google上有很多关于TLS和身份验证的文章,但我浏览了很多,没有找到任何关于我做错了什么的信息。

共有1个答案

谢建业
2023-03-14

我们最好不要指定TLS版本,配置你的代码让OS来决定。通信中使用的具体TLS版本将由服务器和客户端环境双方共同决定。
https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
传输安全模式要求在通信之前就应该建立服务器和客户端之间的信任关系。
在我看来,错误通常表明客户端没有正确安装服务器证书。
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/transport-security-with-certificate-authentication
只有服务器端添加Servicetadata行为,我们才能访问服务html" target="_blank">定义(WSDL)。
通常客户端提供的证书就足够了要表明其身份,并且不需要再次提供用户名/密码。就像生成的客户端配置一样,我们只需要提供一个证书。服务是如何具体调用的,我们必须知道服务器的配置或WSDL文件。
如果有什么我可以帮助的,请随时告诉我。

 类似资料:
  • 我们很难与远程机器(如PayPal vb)建立https连接谁从我们的系统中禁用了SSL3协议。Net应用程序。HttpWebRequest实例的GetResponse方法出现以下异常。 请求被中止:无法创建SSL/TLS安全通道。 当我们使用WireShark深入并跟踪网络日志时,我们看到远程机器返回以下错误 TLSv1。2警报(级别:致命,描述:握手失败)握手失败40 更有趣的情况是,当我尝试

  • > 客户端发送带有密码套件中包含的密码的“Client Hello”消息。 在server.xml中,这些密码都不出现。以下是catalina的条目: 连接器port=“4443”sslenabled=“true”acceptcount=“20000”maxthreads=“5000”allowtrace=“false”scheme=“https”secure=“true”clientauth=“

  • 在JDK 11下使用TLS 1.3原则上是可行的。然而,一旦在两个并发线程中建立连接,两个线程的初始握手都会失败。 这显然是一个已知的问题,应该已经解决了: Oracle JDK 11.0.2 OpenJDK 11.0.3 使用OpenJDK,这应该是固定的: 或者甚至是OpenJDK(这是今天在AdoptOpenJDK. net上可用的最新选项): 这是正式修复的,但我似乎无法让它工作。 这是怎

  • 我不知道我到底需要在哪里包含客户机证书。现在,我的第一个问题是我不信任服务器。我尝试使用默认的Java密钥库文件(cacerts),其中包含Thawte和Digicert,这些是我试图与之通信的服务器的根权限。我使用

  • 我得到这个错误,而试图在linux上执行和旧的MapleStory服务器,我已经尝试了相同的文件在窗口和工作没有问题。我尝试了多个Java版本没有成功。

  • 我正在go中运行https web服务器。我正在使用angular web应用程序(Chrome浏览器)对其进行测试,该应用程序可以对web服务器进行ajax调用。 如果我不断地点击网络服务器,一切似乎都正常。但每当我让它闲置一段时间并点击web服务器时,来自浏览器的ajax调用都不会得到响应。我几乎总是在服务器日志中看到此日志行。 我可以确认IP地址是我的IP地址。 我像这样启动我的https服