【问题标题】:Received fatal alert: handshake_failure through SSLHandshakeException收到致命警报:handshake_failure 通过 SSLHandshakeException
【发布时间】:2016-10-13 08:43:37
【问题描述】:

我遇到了授权 SSL 连接的问题。我创建了使用客户端授权 SSL 证书连接到外部服务器的 Struts Action。在我的操作中,我试图向银行服务器发送一些数据,但没有任何运气,因为服务器导致我出现以下错误:

error: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

我的 Action 类中将数据发送到服务器的方法

//Getting external IP from host
    URL whatismyip = new URL("http://automation.whatismyip.com/n09230945.asp");
    BufferedReader inIP = new BufferedReader(new InputStreamReader(whatismyip.openStream()));

    String IPStr = inIP.readLine(); //IP as a String

    Merchant merchant;

    System.out.println("amount: " + amount + ", currency: " + currency + ", clientIp: " + IPStr + ", description: " + description);

    try {

        merchant = new Merchant(context.getRealPath("/") + "merchant.properties");

    } catch (ConfigurationException e) {

        Logger.getLogger(HomeAction.class.getName()).log(Level.INFO, "message", e);
        System.err.println("error: " + e.getMessage());
        return ERROR;
    }

    String result = merchant.sendTransData(amount, currency, IPStr, description);

    System.out.println("result: " + result);

    return SUCCESS;

我的商家.properties 文件:

bank.server.url=https://-servernameandport-/
https.cipher=-cipher-

keystore.file=-key-.jks
keystore.type=JKS
keystore.password=-password-
ecomm.server.version=2.0

encoding.source=UTF-8
encoding.native=UTF-8

第一次以为这是证书问题,我把它从.pfx转换成.jks,但我还是有同样的错误,没有任何变化。

【问题讨论】:

  • 您是否将服务器的 ssl 证书添加到您的信任库?
  • 对不起,我不明白这是什么意思,我是 SSL 新手
  • 我假设您的应用正在使用 java 默认信任库。默认信任库是 /lib/security/cacerts。使用浏览器打开服务器的 url 并下载所有 ssl 证书;包括任何链/中间证书。然后将所有这些证书添加到信任库。
  • 我无法在浏览器中打开网址,因为客户端身份验证证书,我只能将我从客户端获取的特定参数发送到此链接。
  • 只要打开网址。忽略您在浏览器上看到的所有错误。当您访问该网址时,您应该会在浏览器的地址栏上看到一个挂锁图标。单击它并下载服务器的 ssl 证书。

标签: java ssl ssl-certificate sslhandshakeexception


【解决方案1】:

握手失败可能有多种原因:

  • 客户端和服务器使用的密码套件不兼容。这将要求客户端使用(或启用)服务器支持的密码套件。
  • 使用的 SSL 版本不兼容(服务器可能只接受 TLS v1,而客户端只能使用 SSL v3)。同样,客户端可能必须确保它使用 SSL/TLS 协议的兼容版本。
  • 服务器证书的信任路径不完整;服务器的证书可能不受客户端信任。这通常会导致更详细的错误,但很有可能。通常解决方法是将服务器的 CA 证书导入客户端的信任库。
  • 证书是为不同的域颁发的。同样,这会导致更冗长的消息,但我会在此处说明修复,以防这是原因。在这种情况下,解决方案是让服务器(它似乎不是您的)使用正确的证书。

由于无法查明潜在故障,最好打开-Djavax.net.debug=all 标志以启用对已建立 SSL 连接的调试。打开调试后,您可以查明握手中的哪些活动失败了。

更新

根据现在可用的详细信息,问题似乎是由于颁发给服务器的证书和根 CA 之间的证书信任路径不完整。大多数情况下,这是因为信任库中没有根CA的证书,导致出现证书信任路径不存在的情况;该证书基本上不受客户端信任。浏览器可以显示警告,以便用户忽略这一点,但 SSL 客户端(如 HttpsURLConnection 类或任何 HTTP 客户端库如 Apache HttpComponents Client)并非如此。

大多数这些客户端类/库将依赖 JVM 使用的信任库来进行证书验证。在大多数情况下,这将是 JRE_HOME/lib/security 目录中的 cacerts 文件。如果已使用 JVM 系统属性 javax.net.ssl.trustStore 指定了信任库的位置,则该路径中的存储通常是客户端库使用的存储。如果您有疑问,请查看您的 Merchant 类,并找出它用于建立连接的类/库。

将服务器的证书颁发 CA 添加到此信任存储应该可以解决问题。为此,您可以参考我的answer on a related question on getting tools,但Java keytool utility 就足够了。

警告:信任库本质上是您信任的所有 CA 的列表。如果您放入的证书不属于您不信任的 CA,那么如果私钥可用,则可以解密与具有该实体颁发的证书的站点的 SSL/TLS 连接。

更新 #2:了解 JSSE 跟踪的输出

JVM 使用的 keystore 和 truststores 通常列在最开始,有点像下面这样:

keyStore is : 
keyStore type is : jks
keyStore provider is : 
init keystore
init keymanager of type SunX509
trustStore is: C:\Java\jdk1.6.0_21\jre\lib\security\cacerts
trustStore type is : jks
trustStore provider is : 

如果使用了错误的信任库,那么您需要将服务器的证书重新导入到正确的证书中,或者重新配置服务器以使用列出的证书(如果您有多个 JVM,则不建议这样做,并且它们都是用于不同的需求)。

如果您想验证信任证书列表是否包含所需的证书,那么有一个相同的部分,开头为:

adding as trusted cert:
  Subject: CN=blah, O=blah, C=blah
  Issuer:  CN=biggerblah, O=biggerblah, C=biggerblah
  Algorithm: RSA; Serial number: yadda
  Valid from SomeDate until SomeDate

您需要查找服务器的 CA 是否为主题。

握手过程会有一些显着的条目(你需要了解 SSL 才能详细理解它们,但为了调试当前问题,知道通常在 ServerHello 中报告握手失败就足够了.

1.客户您好

在初始化连接时会报告一系列条目。客户端在 SSL/TLS 连接设置中发送的第一条消息是 ClientHello 消息,通常在日志中报告为:

*** ClientHello, TLSv1
RandomCookie:  GMT: 1291302508 bytes = { some byte array }
Session ID:  {}
Cipher Suites: [SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_DES_CBC_SHA, SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA]
Compression Methods:  { 0 }
***

注意使用的密码套件。这可能必须与您的 Mercer.properties 文件中的条目一致,因为银行库可能采用相同的约定。如果使用的约定不同,则无需担心,因为如果密码套件不兼容,ServerHello 会声明。

2。服务器你好

服务器以 ServerHello 响应,这将指示连接设置是否可以继续。日志中的条目通常属于以下类型:

*** ServerHello, TLSv1
RandomCookie:  GMT: 1291302499 bytes = { some byte array}
Cipher Suite: SSL_RSA_WITH_RC4_128_SHA
Compression Method: 0
***

注意它选择的密码套件;这是服务器和客户端都可以使用的最佳套件。如果出现错误,通常不会指定密码套件。服务器的证书(以及可选的整个链)由服务器发送,并且可以在以下条目中找到:

*** Certificate chain
chain [0] = [
[
  Version: V3
  Subject: CN=server, O=server's org, L=server's location, ST =Server's state, C=Server's country
  Signature Algorithm: SHA1withRSA, OID = some identifer

.... the rest of the certificate
***

如果证书验证成功,您会发现类似以下的条目:

Found trusted certificate:
[
[
  Version: V1
  Subject: OU=Server's CA, O="Server's CA's company name", C=CA's country
  Signature Algorithm: SHA1withRSA, OID = some identifier

上述步骤之一不会成功,导致握手失败,因为握手通常在这个阶段完成(不是真的,但握手的后续阶段通常不会导致握手失败)。您需要确定哪一步失败,并发布适当的消息作为问题的更新(除非您已经理解该消息,并且知道如何解决它)。

【讨论】:

  • 如果可以的话,请发布您所拥有的任何内容,以便我可以用更具体的答案更新答案。
  • 好吧,Vineet,我不知道如何处理它,我已经筋疲力尽了。我找到了一种使用 openssl "openssl s_client -connect servername:4402" 检查服务器 URL 的方法,看看我得到了什么:img225.imageshack.us/img225/8999/screenshoturr.png
  • @hoss,看起来服务器的证书是由一个不存在于 OpenSSL 使用的信任库中的实体颁发的,也可能不存在于 使用的信任库中您的服务器(客户端),当它连接到服务器时。在这种情况下,您需要将颁发证书的 CA 的证书(而不是服务器)导入您的客户端(OpenSSL/您的服务器)信任库.
  • 嗯,可能是依赖 cacerts。但是只有了解网络调试的输出才能确定这一点。如果你想检查这个,你需要使用keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts 命令打印出内容。然后验证 cacerts 中的证书是否与银行证书的 CA 匹配。
  • 默认通常是changeit。除非它被改变了。
【解决方案2】:

当客户需要出示证书时也会发生这种情况。服务器列出证书链后,可能会发生以下情况:

3.证书申请 服务器将从客户端发出证书请求。该请求将列出服务器接受的所有证书。

*** CertificateRequest
Cert Types: RSA
Cert Authorities:
<CN=blah, OU=blah, O=blah, L=blah, ST=blah, C=blah>
<CN=yadda, DC=yadda, DC=yadda>
<CN=moreblah, OU=moreblah, O=moreblah, C=moreblah>
<CN=moreyada, OU=moreyada, O=moreyada, C=moreyada>
... the rest of the request
*** ServerHelloDone

4.客户端证书链 这是客户端发送到服务器的证书。

*** Certificate chain
chain [0] = [
[
  Version: V3
  Subject: EMAILADDRESS=client's email, CN=client, OU=client's ou, O=client's Org, L=client's location, ST=client's state, C=client's Country
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5
  ... the rest of the certificate
*** ClientKeyExchange, RSA PreMasterSecret, TLSv1    
... key exchange info 

如果链中没有证书而服务器需要证书,您将在此处收到握手错误。一个可能的原因是找不到您的证书的路径。

5.证书验证 客户端要求服务器验证证书

*** CertificateVerify
... payload of verify check

只有在您发送证书时才会执行此步骤。

6.完成 服务器将响应验证响应

*** Finished
verify_data:  { 345, ... }

【讨论】:

  • 就我而言,似乎所有步骤都很好,但仍然出现握手错误。
  • 非常好的答案...但是在我的握手失败中所有这些都可以,但我仍然失败了。你能看看我的类似问题吗?
  • 未能提供客户端证书并不是 TLS 中的任何错误。如果服务器需要客户端证书但没有提供,它将关闭连接。
  • @EJP 没错,这不是 TLS 中的错误,但是失败的连接在 Java 代码中显示为错误。
  • @Brig 但不是作为警报,这就是这个答案所说的,以及问题是关于什么的。
【解决方案3】:

我认为这并不能解决第一个提问者的问题,但对于来到这里寻求答案的谷歌人来说:


在更新 51 上,java 1.8 默认禁止[1] RC4 密码,我们可以在发行说明页面上看到:

错误修复:禁止 RC4 密码套件

RC4 现在被认为是一种泄露的密码。

RC4 密码套件已从 Oracle JSSE 实施中客户端和服务器默认启用的密码套件列表中删除。这些密码套件仍然可以通过SSLEngine.setEnabledCipherSuites()SSLSocket.setEnabledCipherSuites() 方法启用。请参阅 JDK-8077109(未公开)。

如果您的服务器强烈偏好此密码(或仅使用此密码),这可能会在 java 上触发 handshake_failure

您可以测试连接到启用 RC4 密码的服务器(首先,尝试不使用 enabled 参数以查看是否触发 handshake_failure,然后设置 enabled

import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.*;

import java.util.Arrays;

/** Establish a SSL connection to a host and port, writes a byte and
 * prints the response. See
 * http://confluence.atlassian.com/display/JIRA/Connecting+to+SSL+services
 */
public class SSLRC4Poke {
    public static void main(String[] args) {
        String[] cyphers;
        if (args.length < 2) {
            System.out.println("Usage: "+SSLRC4Poke.class.getName()+" <host> <port> enable");
            System.exit(1);
        }
        try {
            SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
            SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(args[0], Integer.parseInt(args[1]));
        
            cyphers = sslsocketfactory.getSupportedCipherSuites();
            if (args.length ==3){
                sslsocket.setEnabledCipherSuites(new String[]{
                    "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5",
                    "SSL_DH_anon_WITH_RC4_128_MD5",
                    "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
                    "SSL_RSA_WITH_RC4_128_MD5",
                    "SSL_RSA_WITH_RC4_128_SHA",
                    "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
                    "TLS_ECDHE_RSA_WITH_RC4_128_SHA",
                    "TLS_ECDH_ECDSA_WITH_RC4_128_SHA",
                    "TLS_ECDH_RSA_WITH_RC4_128_SHA",
                    "TLS_ECDH_anon_WITH_RC4_128_SHA",
                    "TLS_KRB5_EXPORT_WITH_RC4_40_MD5",
                    "TLS_KRB5_EXPORT_WITH_RC4_40_SHA",
                    "TLS_KRB5_WITH_RC4_128_MD5",
                    "TLS_KRB5_WITH_RC4_128_SHA"
                });     
            }

            InputStream in = sslsocket.getInputStream();
            OutputStream out = sslsocket.getOutputStream();

            // Write a test byte to get a reaction :)
            out.write(1);

            while (in.available() > 0) {
                System.out.print(in.read());
            }
            System.out.println("Successfully connected");

        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}

1 - https://www.java.com/en/download/faq/release_changes.xml

【讨论】:

    【解决方案4】:

    我今天使用 OkHttp 客户端获取基于 https 的 URL 时遇到了同样的问题。 是由服务器端和客户端之间的 Https 协议版本和 Cipher 方法不匹配造成的

    1)检查您的网站 https 协议版本和密码方法。

    openssl&gt;s_client -connect your_website.com:443 -showcerts

    你会得到很多详细信息,关键信息如下:

    SSL-Session:
        Protocol  : TLSv1
        Cipher    : RC4-SHA
    
    2) 配置您的 http 客户端,例如在OkHttp client 的情况下:
    @Test()
    public void testHttpsByOkHttp() {
        ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
                .tlsVersions(TlsVersion.TLS_1_0) //protocol version
                .cipherSuites(
                        CipherSuite.TLS_RSA_WITH_RC4_128_SHA, //cipher method
                        CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
                        CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
                        CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256)
                .build();
    
        OkHttpClient client = new OkHttpClient();
        client.setConnectionSpecs(Collections.singletonList(spec));
        Request request = new Request.Builder().url("https://your_website.com/").build();
        try {
            Response response = client.newCall(request).execute();
            if(response.isSuccessful()){
                logger.debug("result= {}", response.body().string());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    这将得到我们想要的。

    【讨论】:

      【解决方案5】:

      我在尝试使用 JDK 1.7 时遇到此错误。 当我将我的 JDK 升级到 jdk1.8.0_66 时,一切都开始正常工作了。

      所以这个问题最简单的解决方案可能是 - 升级你的 JDK 并且它可以开始正常工作。

      【讨论】:

      • 不错。最简单的解决方案是升级JDK? :D 你知道这有多么复杂,这取决于正在执行的环境吗?假设 Amazon 运行 JDK 7,现在需要突然升级到 JDK 8……很好!
      • 一个简单的次要版本升级为我解决了这个问题..从 JDK 11.0.1 到 11.0.6
      • 确实是最简单的解决方案——我不得不将 jre-1.8.0-openjdk 替换为 jre-1.8.0-oracle。
      【解决方案6】:

      免责声明:我不知道答案是否对很多人有帮助,只是分享,因为它可能。

      我在使用 Parasoft SOATest 发送请求 XML(SOAP) 时遇到此错误。

      问题是我在添加证书并对其进行身份验证后从下拉列表中选择了错误的别名

      【讨论】:

        【解决方案7】:

        我的是 TLS 版本不兼容错误。

        以前是TLSv1 我改了TLSV1.2 这解决了我的问题。

        【讨论】:

          【解决方案8】:

          我正在使用 com.google.api http 客户端。当我与内部公司网站通信时,我错误地使用 https 而不是 http 时遇到了这个问题。

          main, READ: TLSv1.2 Alert, length = 2
          main, RECV TLSv1.2 ALERT:  fatal, handshake_failure
          main, called closeSocket()
          main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
          main, IOException in getSession():  javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
          main, called close()
          main, called closeInternal(true)
          262 [main] DEBUG org.apache.http.impl.conn.DefaultClientConnection  - Connection shut down
          main, called close()
          main, called closeInternal(true)
          263 [main] DEBUG org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager  - Released connection is not reusable.
          263 [main] DEBUG org.apache.http.impl.conn.tsccm.ConnPoolByRoute  - Releasing connection [HttpRoute[{s}->https://<I-replaced>]][null]
          263 [main] DEBUG org.apache.http.impl.conn.tsccm.ConnPoolByRoute  - Notifying no-one, there are no waiting threads
          Exception in thread "main" javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
              at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:431)
              at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
              at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:339)
              at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:123)
              at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:147)
              at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:108)
              at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
              at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641)
              at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:576)
              at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:554)
              at com.google.api.client.http.apache.ApacheHttpRequest.execute(ApacheHttpRequest.java:67)
              at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:960)
          

          【讨论】:

          • 不,你不能。如果服务器不使用 TLS,则服务器无法发送 TLS 警报。
          • 我更新了我的评论以显示我的程序的输出。这是真的。如果您取消反对票,将不胜感激。
          • 这是真实的,但不是由 TLS 与纯文本服务器通信引起的。根据定义,明文服务器不使用 TLS,因此根据定义,您不可能从它那里收到 TLS 警报。您不知道谁对您的答案投了反对票。
          • 我以为你投了反对票——如果不是这样,我很抱歉。我的错误消息与此问题的标题完全匹配。这是获取此错误消息的有效路径/测试用例,我有一个可能对其他人有所帮助的解决方案。恕我直言,我认为它是否是由 TLS 服务器错误响应引起的并不重要。有人会从谷歌登陆这里,如果他们犯了同样的错误,我的回答可能会有所帮助。
          • 我没有对你的错误信息说什么。我正在评论您错误地声称这是由于“错误地使用 HTTPS 而不是 HTTP”。它不是,也不可能是,原因我已经说过,而你没有以任何方式解决。显然,使用 HTTP 肯定会让它消失,因为没有明文形式的 TLS 警报,但不能解决根本问题。
          【解决方案9】:

          假设您使用正确的 SSL/TLS 协议,正确配置您的 keyStoretrustStore,并确认证书本身不存在任何问题,您可能需要 strengthen your security algorithms

          Vineet's answer 中所述,您收到此错误的一个可能原因是使用了不兼容的密码套件。通过使用Java Cryptography Extension (JCE) 中提供的更新我的JDK 的security 文件夹中的local_policyUS_export_policy jar,我能够成功完成握手。

          【讨论】:

          • 更新 local_policy jar 为我解决了问题。
          【解决方案10】:

          握手失败可能是有缺陷的 TLSv1 协议实现。

          在我们的例子中,这对 java 7 有帮助:

          java -Dhttps.protocols=TLSv1.2,TLSv1.1,TLSv1 
          

          jvm 会按照这个顺序进行协商。具有最新更新的服务器将执行 1.2,有错误的服务器将降为 v1,并且可以与 java 7 中的类似 v1 一起使用。

          【讨论】:

          • 这对我有帮助。有我的ClientHello,但是没有server,结局挺突然的。这为我在 Java 7 上修复了它。非常感谢。
          【解决方案11】:

          安装 Java Cryptography Extension (JCE) Unlimited Strength (for JDK7 | for JDK8) 可能会修复此错误。解压文件并按照自述文件进行安装。

          【讨论】:

            【解决方案12】:

            我也有类似的问题;升级到 Apache HTTPClient 4.5.3 修复了它。

            【讨论】:

              【解决方案13】:

              如果配置了我的 Java 客户端进程,我发现一个 HTTPS 服务器以这种方式失败

              -Djsse.enableSNIExtension=false
              

              ServerHello 成功完成之后但在数据流开始之前,与handshake_failure 的连接失败。

              没有明确的错误消息来识别问题,错误只是看起来像

              main, READ: TLSv1.2 Alert, length = 2
              main, RECV TLSv1.2 ALERT:  fatal, handshake_failure
              %% Invalidated:  [Session-3, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384]
              main, called closeSocket()
              main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
              

              我通过尝试使用和不使用“-Djsse.enableSNIExtension=false”选项来隔离问题

              【讨论】:

              • 我在连接到 GDAX 沙箱时遇到同样的错误,有什么解决方案吗?
              • 解决方案是启用 SNI(删除该选项)或要求远程服务器管理员启用不支持 SNI 的连接。
              【解决方案14】:

              在我的情况下,导入了证书,错误仍然存​​在,通过在连接前添加 System.setProperty("https.protocols", "TLSv1.2,TLSv1.1,SSLv3"); 解决了这个问题

              【讨论】:

              • 在 java 1.8 中为我工作。谢谢:)
              【解决方案15】:

              哎呀!对我来说,这只是一个 Java 版本问题。我在使用 JRE 1.6 时遇到了握手错误,而使用 JRE 1.8.0_144 时一切正常。

              【讨论】:

                【解决方案16】:

                就我而言,网站只能使用 TLSv1.2。我使用 apache httpclient 4.5.6,我使用这段代码并安装 jce 来解决这个问题(JDK1.7):

                jce

                jdk7http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

                jdk 8 http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

                代码:

                SSLContext sslContext = SSLContext.getDefault();
                
                  SSLConnectionSocketFactory sslConnectionFactory = new SSLConnectionSocketFactory(
                      sslContext,
                      new String[]{"TLSv1.2"}, // important
                      null,
                      NoopHostnameVerifier.INSTANCE);
                
                  Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                      .register("https", sslConnectionFactory)
                      .register("http", PlainConnectionSocketFactory.INSTANCE)
                      .build();
                
                  HttpClientConnectionManager ccm = new BasicHttpClientConnectionManager(registry);
                  httpclient = HttpClientBuilder.create().
                      .setSSLSocketFactory(sslConnectionFactory)
                      .setConnectionManager(ccm)
                      .build();
                

                【讨论】:

                  【解决方案17】:

                  从开发人员(项目 1)和系统管理员(项目 2 和 3)的角度进行故障排除:

                  1. 通过-Djavax.net.debug=ssl:handshake:verbose 在 Java 中启用 SSL 握手调试。
                  2. 在服务器上通过sudo apt install ssldump 安装ssldump 或从源代码编译,如果您在运行以下步骤时观察到密码中的Unknown value,则按照此link 进行编译。
                  3. 在服务器上,sudo ssldump -k &lt;your-private-key&gt; -i &lt;your-network-interface&gt;
                  4. 查看日志关于真实reason的失败。

                  ssldump 日志握手失败示例:

                  New TCP connection #1: 10.1.68.86(45308) <-> 10.1.68.83(5671)
                  1 1  0.0111 (0.0111)  C>S  Handshake
                        ClientHello
                          Version 3.3
                          cipher suites
                          TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
                          TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
                          TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
                          TLS_RSA_WITH_AES_256_GCM_SHA384
                          TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
                          TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
                          TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
                          TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
                          TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
                          TLS_RSA_WITH_AES_128_GCM_SHA256
                          TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
                          TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
                          TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
                          TLS_DHE_DSS_WITH_AES_128_GCM_SHA256
                          TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
                          TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
                          TLS_RSA_WITH_AES_256_CBC_SHA256
                          TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
                          TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
                          TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
                          TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
                          TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
                          TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
                          TLS_RSA_WITH_AES_256_CBC_SHA
                          TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
                          TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
                          TLS_DHE_RSA_WITH_AES_256_CBC_SHA
                          TLS_DHE_DSS_WITH_AES_256_CBC_SHA
                          TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
                          TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
                          TLS_RSA_WITH_AES_128_CBC_SHA256
                          TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
                          TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
                          TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
                          TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
                          TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
                          TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
                          TLS_RSA_WITH_AES_128_CBC_SHA
                          TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
                          TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
                          TLS_DHE_RSA_WITH_AES_128_CBC_SHA
                          TLS_DHE_DSS_WITH_AES_128_CBC_SHA
                          TLS_EMPTY_RENEGOTIATION_INFO_SCSV
                          compression methods
                                    NULL
                  1 2  0.0122 (0.0011)  S>C  Alert
                      level           fatal
                      value           insufficient_security
                  1    0.0126 (0.0004)  S>C  TCP RST
                  

                  ssldump 日志握手成功示例

                  New TCP connection #1: 10.1.68.86(56558) <-> 10.1.68.83(8443)
                  1 1  0.0009 (0.0009)  C>S  Handshake
                        ClientHello
                          Version 3.3
                          cipher suites
                          TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
                          TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
                          TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
                          Unknown value 0xcca9
                          Unknown value 0xcca8
                          Unknown value 0xccaa
                          TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
                          TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
                          TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
                          TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
                          TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
                          TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
                          TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
                          TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
                          TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
                          TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
                          TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
                          TLS_DHE_RSA_WITH_AES_256_CBC_SHA
                          TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
                          TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
                          TLS_DHE_RSA_WITH_AES_128_CBC_SHA
                          TLS_RSA_WITH_AES_256_GCM_SHA384
                          TLS_RSA_WITH_AES_128_GCM_SHA256
                          TLS_RSA_WITH_AES_256_CBC_SHA256
                          TLS_RSA_WITH_AES_128_CBC_SHA256
                          TLS_RSA_WITH_AES_256_CBC_SHA
                          TLS_RSA_WITH_AES_128_CBC_SHA
                          TLS_EMPTY_RENEGOTIATION_INFO_SCSV
                          compression methods
                                    NULL
                  1 2  0.0115 (0.0106)  S>C  Handshake
                        ServerHello
                          Version 3.3
                          session_id[0]=
                  
                          cipherSuite         TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
                          compressionMethod                   NULL
                  1 3  0.0115 (0.0000)  S>C  Handshake
                        Certificate
                  1 4  0.0115 (0.0000)  S>C  Handshake
                        ServerKeyExchange
                  Not enough data. Found 294 bytes (expecting 32767)
                  1 5    0.0115   (0.0000)    S>C    Handshake
                          ServerHelloDone
                  1 6    0.0141   (0.0025)    C>S    Handshake
                          ClientKeyExchange
                  Not enough data. Found 31 bytes (expecting 16384)
                  1 7    0.0141   (0.0000)    C>S    ChangeCipherSpec
                  1 8    0.0141   (0.0000)    C>S      Handshake
                  1 9    0.0149   (0.0008)    S>C    Handshake
                  1 10   0.0149   (0.0000)    S>C    ChangeCipherSpec
                  1 11   0.0149   (0.0000)    S>C      Handshake
                  

                  Java 日志不工作示例

                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.778 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.779 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.779 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.780 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_256_GCM_SHA384 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.780 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.780 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.781 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.781 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.781 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.782 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_128_GCM_SHA256 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.782 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.782 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.782 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.783 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.783 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.783 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.783 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.783 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: T LS_DHE_RSA_WITH_AES_256_CBC_SHA256 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 for TLS11
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 for TLS10
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 for TLS10
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 for TLS10
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_256_GCM_SHA384 for TLS10
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 for TLS10
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 for TLS10
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 for TLS10
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 for TLS10
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 for TLS10
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_128_GCM_SHA256 for TLS10
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 for TLS10
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 for TLS10
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 for TLS10
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 for TLS10
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 for TLS10
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 for TLS10
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256 for TLS10
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 for TLS10 javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 for TLS10
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 for TLS10
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.787 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 for TLS10
                  javax.net.ssl|WARNING|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.818 MYT|SignatureScheme.java:282|Signature algorithm, ed25519, is not supported by the underlying providers
                  javax.net.ssl|WARNING|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.818 MYT|SignatureScheme.java:282|Signature algorithm, ed448, is not supported by the underlying providers
                  javax.net.ssl|ALL|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.822 MYT|SignatureScheme.java:358|Ignore disabled signature sheme: rsa_md5
                  javax.net.ssl|INFO|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.822 MYT|AlpnExtension.java:161|No available application protocols
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.823 MYT|SSLExtensions.java:256|Ignore, context unavailable extension: application_layer_protocol_negotiation
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.823 MYT|SSLExtensions.java:256|Ignore, context unavailable extension: renegotiation_info
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.825 MYT|ClientHello.java:651|Produced ClientHello handshake message (
                  "ClientHello": {
                    "client version"      : "TLSv1.2",
                    "random"              : "FB BC CD 7C 17 65 86 49 3E 1C 15 37 24 94 7D E7 60 44 1B B8 F4 18 21 D0 E1 B1 31 0D E1 80 D6 A7",
                    "session id"          : "",
                    "cipher suites"       : "[TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384(0xC02C), TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256(0xC02B), TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384(0xC030), TLS_RSA_WITH_AES_256_GCM_SHA384(0x009D), TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384(0xC02E), TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384(0xC032), TLS_DHE_RSA_WITH_AES_256_GCM_SHA384(0x009F), TLS_DHE_DSS_WITH_AES_256_GCM_SHA384(0x00A3), TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(0xC02F), TLS_RSA_WITH_AES_128_GCM_SHA256(0x009C), TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256(0xC02D), TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256(0xC031), TLS_DHE_RSA_WITH_AES_128_GCM_SHA256(0x009E), TLS_DHE_DSS_WITH_AES_128_GCM_SHA256(0x00A2), TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384(0xC024), TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384(0xC028), TLS_RSA_WITH_AES_256_CBC_SHA256(0x003D), TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384(0xC026), TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384(0xC02A), TLS_DHE_RSA_WITH_AES_256_CBC_SHA256(0x006B), TLS_DHE_DSS_WITH_AES_256_CBC_SHA256(0x006A), TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA(0xC00A), TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA(0xC014), TLS_RSA_WITH_AES_256_CBC_SHA(0x0035), TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA(0xC005), TLS_ECDH_RSA_WITH_AES_256_CBC_SHA(0xC00F), TLS_DHE_RSA_WITH_AES_256_CBC_SHA(0x0039), TLS_DHE_DSS_WITH_AES_256_CBC_SHA(0x0038), TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256(0xC023), TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256(0xC027), TLS_RSA_WITH_AES_128_CBC_SHA256(0x003C), TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256(0xC025), TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256(0xC029), TLS_DHE_RSA_WITH_AES_128_CBC_SHA256(0x0067), TLS_DHE_DSS_WITH_AES_128_CBC_SHA256(0x0040), TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA(0xC009), TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA(0xC013), TLS_RSA_WITH_AES_128_CBC_SHA(0x002F), TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA(0xC004), TLS_ECDH_RSA_WITH_AES_128_CBC_SHA(0xC00E), TLS_DHE_RSA_WITH_AES_128_CBC_SHA(0x0033), TLS_DHE_DSS_WITH_AES_128_CBC_SHA(0x0032), TLS_EMPTY_RENEGOTIATION_INFO_SCSV(0x00FF)]",
                    "compression methods" : "00",  "extensions"          : [
                      "server_name (0)": {
                        type=host_name (0), value=mq.tpc-ohcis.moh.gov.my
                      },
                      "status_request (5)": {
                        "certificate status type": ocsp
                        "OCSP status request": {
                          "responder_id": <empty>
                          "request extensions": {
                            <empty>
                          }
                        }
                      },
                      "supported_groups (10)": {
                        "versions": [secp256r1, secp384r1, secp521r1, sect283k1, sect283r1, sect409k1, sect409r1, sect571k1, sect571r1, secp256k1, ffdhe2048, ffdhe3072, ffdhe4096, ffdhe6144, ffdhe8192]
                      },
                      "ec_point_formats (11)": {
                        "formats": [uncompressed]
                      },
                      "signature_algorithms (13)": {
                        "signature schemes": [ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, ecdsa_secp512r1_sha512, rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512, rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pkcs1_sha512, dsa_sha256, ecdsa_sha224, rsa_sha224, dsa_sha224, ecdsa_sha1, rsa_pkcs1_sha1, dsa_sha1]
                      },
                      "signature_algorithms_cert (50)": {
                        "signature schemes": [ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, ecdsa_secp512r1_sha512, rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512, rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pkcs1_sha512, dsa_sha256, ecdsa_sha224, rsa_sha224, dsa_sha224, ecdsa_sha1, rsa_pkcs1_sha1, dsa_sha1]
                      },
                      "status_request_v2 (17)": {
                        "cert status request": {
                          "certificate status type": ocsp_multi
                          "OCSP status request": {
                            "responder_id": <empty>
                            "request extensions": {
                              <empty>
                            }
                          }      }
                      },
                      "extended_master_secret (23)": {
                        <empty>
                      },
                      "supported_versions (43)": {
                        "versions": [TLSv1.2, TLSv1.1, TLSv1]
                      }
                    ]
                  }
                  )
                  javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.829 MYT|Alert.java:238|Received alert message (
                  "Alert": {
                    "level"      : "fatal",
                    "description": "insufficient_security"
                  }
                  )
                  

                  【讨论】:

                    【解决方案18】:

                    就我而言,我在 1.1 版中遇到了一个问题。我用 curl 很容易地重现了这个问题。服务器不支持低于 TLS1.2 的版本。

                    收到的握手问题:

                    curl --insecure --tlsv1.1 -i https://youhost --noproxy "*"
                    

                    在 1.2 版中运行良好:

                    curl --insecure --tlsv1.2 -i https://youhost --noproxy "*"
                    

                    服务器正在运行 Weblogic,并且在 setEnvDomain.sh 中添加此参数使其可以与 TLSv1.1 一起使用:

                    -Dweblogic.security.SSL.minimumProtocolVersion=TLSv1.1
                    

                    【讨论】:

                      【解决方案19】:

                      这个问题是由于 java 版本而发生的。我正在使用 1.8.0.231 JDK 并收到此错误。我已经将我的 java 版本从 1.8.0.231 降级到 1.8.0.171,现在可以正常工作了。

                      【讨论】:

                        猜你喜欢
                        • 2012-10-15
                        • 2014-03-09
                        • 2020-06-07
                        • 2017-12-26
                        • 2021-06-20
                        • 2012-03-18
                        相关资源
                        最近更新 更多