apache和Java之间的“解密失败或坏记录mac”
Posted
技术标签:
【中文标题】apache和Java之间的“解密失败或坏记录mac”【英文标题】:"decryption failed or bad record mac" between apache and Java 【发布时间】:2012-08-06 09:57:43 【问题描述】:我有一个使用 RSA SSL-J 实现 SSL 的 Java 程序(在 tomcat 容器中运行),以及一个使用 mod_ssl/openssl 为 SSL 配置的 apache 网络服务器
当 Java 程序尝试打开到 apache 服务器的 HttpsUrlConnection 时,javax.net.ssl.SSLException: Fatal Alert received: Bad Record Mac
出现错误
(异常堆栈跟踪不是很有帮助,因为 sslj.jar 被混淆了)
问题不是间歇性的。每次都会发生。
这是我将 LogLevel 设置为 debug 后在 apache 上的 mod_ssl 日志:
[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 程序是否提供客户端证书?你能分享一些代码吗? 不,Java 程序没有提供任何客户端证书。我已经添加了 java 代码来提问。 “我有一个 Java 程序(在 tomcat 容器中运行),它使用 RSA SSL-J 实现 SSL”。我在您的代码中没有看到任何证据,而且当 Java 内置 JSSE 时,我也没有看到任何必要性。请澄清。 使用RSA SSL-J的原因与FIPS认证有关。 【参考方案1】:我仅从某些 java 客户端看到此错误。调整 apache 的虚拟主机配置中的 SSLProtocol 以仅允许 TLS 允许客户端连接。
【讨论】:
以上是关于apache和Java之间的“解密失败或坏记录mac”的主要内容,如果未能解决你的问题,请参考以下文章
Apache Hadoop YARN 中的“mapreduce.map.memory.mb”和“mapred.map.child.java.opts”之间有啥关系?
在 Java 中使用 Apache POI XWPF 在 Word 文档中的横向/纵向之间切换