сбой расшифровки или плохая запись mac между apache и Java

У меня есть программа Java (работающая внутри контейнера tomcat), которая использует реализацию RSA SSL-J для SSL, и веб-сервер apache, настроенный для SSL с использованием mod_ssl/openssl

Когда программа Java пыталась открыть HttpsUrlConnection с сервером apache, ошибки с javax.net.ssl.SSLException: Fatal Alert received: Bad Record Mac

(Трассировка стека исключений не очень полезна, так как sslj.jar запутан)

Проблема не прерывистая. Это происходит каждый раз.

Это из журналов mod_ssl на apache после того, как я установил LogLevel для отладки:

[Mon Jul 30 22:00:25 2012] [debug] ssl_engine_kernel.c(1884): OpenSSL: Write: SSLv3 read certificate verify A
[Mon Jul 30 22:00:25 2012] [debug] ssl_engine_kernel.c(1903): OpenSSL: Exit: error in SSLv3 read certificate verify A`
[Mon Jul 30 22:00:25 2012] [debug] ssl_engine_kernel.c(1903): OpenSSL: Exit: error in SSLv3 read certificate verify A
[Mon Jul 30 22:00:25 2012] [info] [client 172.16.195.208] %%CryptoAuditEntry:: SSL library error 1 in handshake (server <HOSTNAME>:9005)
[Mon Jul 30 22:00:25 2012] [info] %%CryptoAuditEntry:: SSL Library Error: 336130329 error:1408F119:SSL routines:SSL3_GET_RECORD:decryption failed or bad record mac
[Mon Jul 30 22:00:25 2012] [info] [client <IPADDRESS>] %%CryptoAuditEntry:: Connection closed to child 4 with abortive shutdown (server <HOSTNAME>:9005)

Это код стороны Java:

                SSLContext sc = SSLContext.getInstance("TLS");
                sc.init(null /*keyManagers*/, trustAllCerts,
                          new java.security.SecureRandom());
                HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
                HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();


                // Don't check the hostname against the certificate name
                conn.setHostnameVerifier(new HostnameVerifier() {
                        public boolean verify(String urlHostname,
                            SSLSession session) {
                            return true;
                        }
                    });
                conn.setDoInput(true);
                conn.setDoOutput(true);
                conn.setUseCaches(false);
                conn.setRequestProperty("METHOD", "POST");
                conn.setRequestProperty("Authorization", "Basic " +
                    credentials);
                conn.setRequestProperty("Content-Type", "application/pkcs10");
                conn.setReadTimeout(8000);
                conn.connect();

Еще один интересный факт заключается в том, что я могу использовать openssl для подключения к серверу с помощью этой команды без каких-либо проблем.

openssl s_client -connect HOST:PORT

Любые указатели?


person Nishan    schedule 09.08.2012    source источник
comment
Представляет ли программа Java клиентский сертификат? Можете ли вы поделиться кодом?   -  person Duncan Jones    schedule 09.08.2012
comment
Нет, программа Java не предоставляет сертификат клиента. Я добавил java-код в вопрос.   -  person Nishan    schedule 09.08.2012
comment
У меня есть программа Java (работающая внутри контейнера tomcat), которая использует реализацию RSA SSL-J для SSL. Я не вижу никаких доказательств этого в вашем коде, и я также не вижу необходимости в этом, когда Java поставляется со встроенным JSSE. Просьба уточнить.   -  person user207421    schedule 09.08.2012
comment
Причина использования RSA SSL-J связана с сертификацией FIPS.   -  person Nishan    schedule 09.08.2012


Ответы (1)


Я видел эту ошибку только у некоторых java-клиентов. Настройка SSLProtocol в конфигурации виртуального хоста apache для разрешения только TLS разрешил клиентам подключаться.

person AXE Labs    schedule 21.09.2015