javax. net .ssl.SSLHandshakeException: нет оборотного набора шифров (фатальная ошибка: 80: проблема с переносом данных приложения) - PullRequest
1 голос
/ 26 мая 2020

Я использую причал (9.4.12.v20180830) HTTPClient для вызова REST API.

Подтверждение связи SSL / TLS завершается ошибкой с приведенной ниже трассировкой исключения.

Мы версия IBM java 1.8.

jdk.tls.client.protocols определяется как TLSv1.2 Протокол SSLv3 был запрошен, но не включен ПОДДЕРЖИВАЕМЫЕ: [TLSv1, TLSv1.1 , TLSv1.2] SERVER_DEFAULT: [TLSv1, TLSv1.1, TLSv1.2] CLIENT_DEFAULT: [TLSv1.2] IBMJSSE2 включит защиту CB C с помощью SSLEngineImpl. IBMJSSE2 разрешит повторное согласование RF C 5746 для com.ibm.jsse2.renegotiate, для которого установлено значение none или по умолчанию IBMJSSE2 не будет требовать индикатор повторного согласования во время первоначального рукопожатия для com.ibm.jsse2.renegotiation.indicator, установленного в OPTIONAL или принятого по умолчанию IBMJSSE2 не будет выполнить проверку идентичности по проверке сертификата однорангового узла во время повторного согласования для com.ibm.jsse2.renegotiation.peer.cert.check, установленного на ВЫКЛ. или по умолчанию IBMJSSE2 разрешит инициированное клиентом повторное согласование, если для jdk.tls.rejectClientInitiatedRenegotiation установлено значение FALSE или IBMJSSE2 по умолчанию не разрешит небезопасное изменение сертификата сервера во время повторного согласования для jdk.tls.allowUnsafeServerCertChange, установленного на FALSE или по умолчанию

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 Ответ

0 голосов
/ 26 мая 2020

Эта проблема целиком является результатом нестандартной JVM, которую поддерживает IBM (она не соответствует стандарту Java JVM и стандарту SSL / TLS).

Суть вашей спецификации Проблема c заключается в том, что IBM JVM не по какой-то причине использует стандартные имена RF C для наборов шифров SSl / TLS.

Вам придется настроить вручную, наборы шифров исключают и включают, чтобы надеяться на функциональность. (это очищает комплекты шифров, которые, как известно, уязвимы).

Список исключенных комплектов шифров по умолчанию представляет собой комбинацию того, что исключает 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_.*$"
};

Затем, прежде чем вы решите использовать эту уязвимую конфигурацию, вам придется вручную объявить именованные наборы шифров IBM JVM, которыми вы хотите ограничить свое использование, с помощью вызова SslContextFactory.setIncludeCipherSuites(...).

...