2012-08-09 49 views
1

我有一個使用SSL的RSA SSL-J實現的Java程序(運行在tomcat容器內),以及使用mod_ssl/openssl爲SSL配置的apache web服務器apache和Java之間的「解密失敗或錯誤的記錄mac」

當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 

任何指針?

+0

Java程序是否呈現客戶端證書?你能分享一些代碼嗎? – 2012-08-09 08:21:13

+0

不,Java程序不提供任何客戶端證書。我已經添加了java代碼來提問。 – Nishan 2012-08-09 09:28:27

+0

「我有一個使用SSL的RSA SSL-J實現的Java程序(運行在tomcat容器內)」。我在代碼中看不到任何證據,當Java內置JSSE時,我也沒有看到它的任何必要。請澄清。 – EJP 2012-08-09 10:09:04

回答

0

我從某些java客戶端只看到這個錯誤。調整apache的虛擬主機配置中的SSLProtocol,僅允許TLS允許客戶端連接。

相關問題