当前位置: 首页 > 面试题库 >

接收SSLHandshakeException:尽管我的客户端忽略了所有证书,但是handshake_failure

裘嘉树
2023-03-14
问题内容

我有一个Java程序,该程序使用SSL /
TLS连接到Web服务器,并通过该连接发送各种HTTP请求。服务器是本地主机,并且正在使用自签名证书,但是我的代码正在使用自定义TrustManager,并且忽略无效的证书。到目前为止,它一直运行良好。

服务器上的唯一区别是它曾经运行过jboss
6,现在正在运行jboss7。我不确定这是否是配置问题,或者我的代码是否存在问题,但是如果出现以下错误,我会得到相同的错误我尝试使用其他基于Java的程序(例如WebScarab或ZAP)进行连接。

无论如何,我可以对我的代码做些什么来解决这个问题?这是完整的错误:

Received fatal alert: handshake_failure
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(Unknown Source)

这是失败之前的调试消息:

main, WRITE: TLSv1 Handshake, length = 75
main, WRITE: SSLv2 client hello message, length = 101
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1 ALERT: fatal, handshake_failure

问题答案:

所以我发现了问题。Java中可能存在一个错误,但是客户端似乎启动了TLSv1握手,但是随后发送了SSLv2客户端问候消息,此时服务器拒绝了连接。

即使使用TLS实例创建SSLContext,也会发生这种情况:

SSLContext sslContext = SSLContext.getInstance("TLS");

解决方案是在尝试进行任何连接之前设置系统属性:

System.setProperty("https.protocols", "TLSv1");

可能还有其他解决方案,但这对我有用。



 类似资料:
  • 问题内容: 我正在使用Jersey客户端库针对在jboss上运行的rest服务运行测试。我使用自签名证书在服务器(在本地主机上运行)上设置了https。 但是,每当我使用https url运行测试时,都会出现以下错误: 我知道这是因为我的自签名证书不在Java密钥库中。有什么办法可以让我不检查ssl证书的有效性,而直接使用它呢? 这段代码只能在测试服务器上运行,因此,我不想在每次设置新的测试服务器

  • 问题内容: 我目前在服务器具有默认的自签名SSL证书的测试环境中工作。我正在使用Restlet 2.1-RC2并实例化客户端资源,如下所示: 并在每次打来的电话中重复使用客户端。如何设置客户端,使其忽略有问题的证书。 问题答案: 正确的方法 是使用以下 方法 将此自签名证书导入客户端的信任库: 您可以直接在可能缺乏灵活性的JRE信任库()中进行操作,也可以在自己的文件副本中进行操作,然后将该文件设

  • 我的库需要连接到任意的AWS-IoT帐户,因此我在实例化AWS客户端时传递所需的凭据: 根据boto3文档(摘录如下),以这种方式传递的凭据应该覆盖所有其他凭据。然而,此调用从Boto3生成以下日志消息: 我真的不希望boto3拾取用户可能在他们的系统上配置的任何凭据——我希望它只使用我传递给boto3.client()的凭据。有什么想法如何确保这一点? 两份文件摘录:

  • 本文向大家介绍什么是客户端证书?相关面试题,主要包含被问及什么是客户端证书?时的应答技巧和注意事项,需要的朋友参考一下 客户端系统向远程服务器发出经过身份验证的请求所用的数字证书被称为客户端证书。客户端证书在许多相互认证设计中起着非常重要的作用,为请求者的身份提供了强有力的保证。

  • 我收到了一个新的密钥库。jks文件用于ssl连接,以替换旧的但仍在工作的。jks密钥库文件,但我收到了“意外握手消息:serve_hello”错误。我被告知要确保密钥库包含客户端证书,所以我使用keytool将其证书导出到pem文件,然后使用openssl检查目的。结果显示 证书用途:SSL客户端:否SSL客户端CA:否SSL服务器:是SSL服务器CA:否... 然而,当我应用相同的过程来检查旧的

  • 有没有一种方法可以忽略SSL证书验证,而连接elasticsearch 7.4使用高级rest客户端。我探索了几个选择,但在我的情况下没有任何效果。我有一个HTTPS ES群集,我想通过忽略ssl证书验证从我的Spring引导应用程序连接。