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
任何指針?
Java程序是否呈現客戶端證書?你能分享一些代碼嗎? – 2012-08-09 08:21:13
不,Java程序不提供任何客戶端證書。我已經添加了java代碼來提問。 – Nishan 2012-08-09 09:28:27
「我有一個使用SSL的RSA SSL-J實現的Java程序(運行在tomcat容器內)」。我在代碼中看不到任何證據,當Java內置JSSE時,我也沒有看到它的任何必要。請澄清。 – EJP 2012-08-09 10:09:04