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

javax。网ssl。SSLHandshakeException:没有可协商的密码套件(致命错误:80:包装应用程序数据时出现问题)

孟胤
2023-03-14

我正在使用jetty(9.4.12.v20180830)HTTPClient来调用RESTAPI。

SSL/TLS握手失败,出现以下异常跟踪。

我们是IBM java 1.8版本。

jdk。tls。客户协议定义为TLSv1.2。请求了SSLv3协议,但未启用。支持:【TLSv1、TLSv1.1、TLSv1.2】服务器\u默认值:【TLSv1、TLSv1.1、TLSv1.2】客户端\u默认值:【TLSv1.2】IBMJSSE2将使用SSLEngineImpl启用CBC保护。IBMJSSE2将允许每个com重新协商RFC 5746。ibm。jsse2.renegotiate设置为none或默认值IBMJSSE2在每个com的初始握手期间不需要重新协商指示符。ibm。jsse2.重新谈判。指标设置为可选或默认值时,IBMJSSE2不会在每个com重新协商期间针对对等证书检查执行身份检查。ibm。jsse2.重新谈判。同龄人cert.check设置为OFF或默认IBMJSSE2将允许客户端根据jdk发起重新协商。tls。RejectClientInitiatedNegotiation设置为FALSE或默认值IBMJSSE2将不允许在每个jdk重新协商期间更改不安全的服务器证书。tls。allowUnsafeServerCertChange设置为FALSE或default

Is initial handshake: true
%% No cached client session
HttpClient@21ffc2b4-32, fatal error: 80: problem wrapping app data
javax.net.ssl.SSLHandshakeException: No negotiable cipher suite
HttpClient@21ffc2b4-32, SEND TLSv1.2 ALERT:  fatal, description = internal_error
HttpClient@21ffc2b4-32, WRITE: TLSv1.2 Alert, length = 2
HttpClient@21ffc2b4-32, called closeOutbound()
HttpClient@21ffc2b4-32, closeOutboundInternal()
[Raw write]: length = 7
0000: 15 03 03 00 02 02 50                               ......P

java.util.concurrent.ExecutionException: javax.net.ssl.SSLHandshakeException: No negotiable cipher suite
        at org.eclipse.jetty.client.util.FutureResponseListener.getResult(FutureResponseListener.java:118)
        at org.eclipse.jetty.client.util.FutureResponseListener.get(FutureResponseListener.java:110)
        at

jdk.tls.client.protocols is defined as TLSv1.2
    SSLv3 protocol was requested but was not enabled
    SUPPORTED: [TLSv1, TLSv1.1, TLSv1.2]
    SERVER_DEFAULT: [TLSv1, TLSv1.1, TLSv1.2]
    CLIENT_DEFAULT: [TLSv1.2]
    IBMJSSE2 will enable CBC protection
    Using SSLEngineImpl.
    IBMJSSE2 will allow RFC 5746 renegotiation per com.ibm.jsse2.renegotiate set to none or default
    IBMJSSE2 will not require renegotiation indicator during initial handshake per com.ibm.jsse2.renegotiation.indicator set to OPTIONAL or default taken
    IBMJSSE2 will not perform identity checking against the peer cert check during renegotiation per com.ibm.jsse2.renegotiation.peer.cert.check set to OFF or default
    IBMJSSE2 will allow client initiated renegotiation per jdk.tls.rejectClientInitiatedRenegotiation set to FALSE or default
    IBMJSSE2 will not allow unsafe server certificate change during renegotiation per jdk.tls.allowUnsafeServerCertChange set to FALSE or default

    Is initial handshake: true
    %% No cached client session
    HttpClient@21ffc2b4-32, fatal error: 80: problem wrapping app data
    javax.net.ssl.SSLHandshakeException: No negotiable cipher suite
    HttpClient@21ffc2b4-32, SEND TLSv1.2 ALERT:  fatal, description = internal_error
    HttpClient@21ffc2b4-32, WRITE: TLSv1.2 Alert, length = 2
    HttpClient@21ffc2b4-32, called closeOutbound()
    HttpClient@21ffc2b4-32, closeOutboundInternal()
    [Raw write]: length = 7
    0000: 15 03 03 00 02 02 50                               ......P

    java.util.concurrent.ExecutionException: javax.net.ssl.SSLHandshakeException: No negotiable cipher suite
            at org.eclipse.jetty.client.util.FutureResponseListener.getResult(FutureResponseListener.java:118)
            at org.eclipse.jetty.client.util.FutureResponseListener.get(FutureResponseListener.java:110)
            at

下面是使用的示例代码,

public void initialise() {
        /*
         * This is to suppress Jetty logging framework, otherwise it will log
         * errors & traces into stderr. Create and set a dummy Jetty Framework
         * as the Jetty logger class.
         */
        System.setProperty("org.eclipse.jetty.util.log.class",
                "com.ibm.tivoli.netcool.integrations.transportmodule.JettyLoggerSink");

        if (sslEnabled) {
            try {
                logger.log(Level.FINEST, "Initializing secure connection");
                if (keyStoreFilename == null || keyStorePassword == null) {
                    throw new Exception(
                            "Key store filename or password not set.");
                }
                SslContextFactory sslContext = new SslContextFactory(false);
                sslContext.setKeyStorePath(keyStoreFilename);
                sslContext.setKeyStorePassword(keyStorePassword);               
                sslContext.setProtocol("TLSv1.2");                
                sslContext.start();
                client = new HttpClient(sslContext);
            } catch (Exception e) {
                initialise_successful = false;
            }
        } else {
            /*
             * Non-SSL client initialization
             */
            client = new HttpClient();
        }
        try {
            client.start();

        } catch (Exception e) {
            initialise_successful = false;
        }
        initialise_successful = true;
        logger.log(Level.FINEST,
                "HTTP client has been successfully initialized");
    }

任何帮助都将得到感谢。

共有1个答案

秦诚
2023-03-14

这个问题完全是IBM维护的非标准JVM造成的(它不符合Java JVM标准,也不符合SSL/TLS标准)。

您的具体问题的核心是,IBM JVM出于某种原因没有为SSl/TLS密码套件使用RFC标准名称。

您必须手动配置密码套件排除和包含,才能实现任何功能。

首先,使用SslContextFactory.setExdu deCipherSuites()将排除设置为空白,然后重试。(这会清除已知易受攻击的密码套件)。

排除的Cipher Suite的默认列表是JVM排除的内容、操作系统库排除的内容和Jetty排除的内容的组合。

// Jetty Exclusion List

private static final String[] DEFAULT_EXCLUDED_CIPHER_SUITES = {
    // Exclude weak / insecure ciphers
    "^.*_(MD5|SHA|SHA1)$",
    // Exclude ciphers that don't support forward secrecy
    "^TLS_RSA_.*$",
    // The following exclusions are present to cleanup known bad cipher
    // suites that may be accidentally included via include patterns.
    // The default enabled cipher list in Java will not include these
    // (but they are available in the supported list).
    "^SSL_.*$",
    "^.*_NULL_.*$",
    "^.*_anon_.*$"
};

然后,在决定使用此易受攻击的配置之前,必须通过SslContextFactory手动声明要限制使用的IBM JVM命名密码套件。setIncludeCipherSuites(…) 呼叫。

 类似资料:
  • 我正在尝试使用Spring RestTemplate调用POST Rest调用: 这个https://server.com有证书:webapi。tartu-x86。p12我将证书导入C:\Java_8\jre\lib\security\cacerts usinf keytool 运行代码后,我出现以下错误: 我使用的是Java1.8.091 有人能帮忙吗?

  • 问题内容: 按照此处的说明进行操作,并重新创建了我以前错误创建的证书。就像我现在在服务器和客户端上看到的一样,情况发生了变化。 服务器是ClassFileServer.java,相应的客户端是SSLSocketClientWithClientAuth.java 有关使两端都能正常播放的任何提示,请注意,我使用的是localhost,因此我假设密码功能相同。 更新: 这是我用于生成文件的步骤,我可能

  • 我曾尝试将java 11.0.9连接到MySQL 5.6连接器,但在服务器中出现以下错误,但在本地相同的代码中工作正常 引起:javax.net.ssl.SSLHandshakeException:没有适当的协议(协议被禁用或密码套件不合适)在java.base/sun.security.ssl.HandshakeContext.(未知源)在java.base/sun.security.ssl.C

  • 我得到一个"异常在线程"主"javax.net.ssl.SSLHandshake异常:收到致命警报:handshake_failure"下面的代码。有人知道如何修复它吗?

  • 问题内容: 我正在尝试通过Java SSLSockets将安全性应用于简单的聊天应用程序。 我创建了一个自签名的CA,并用它签署了两个证书(全部使用了RSA密钥),一个证书用于服务器,一个证书用于客户端。之后,我将证书导入服务器的密钥库和客户端的密钥库。 我想使用特定的密码,但显然所有受支持的密码均无效。 我为客户提供的代码: 对于服务器: 对不起,如果我的英语有点生锈。 我的操作系统是OS X

  • Java版本1.8.0_121,我看到的解决方案仅适用于Java 9 描述: 我的目标是获取有关项目的信息,比如一个项目的总下载量有一个名为SourceForge Downloads Stats API的API。 所以我创建了一个简单的程序,将结果视为原始文本,我不需要它作为JSON。 例如,我正在获取有关ApacheOpenOffice下载和更多信息- 但是我无法使用获取数据,这是下面错误的原因