java - apache 和 Java 之间的 "decryption failed or bad record mac"

标签 java apache ssl mod-ssl

我有一个 Java 程序(在 tomcat 容器内运行),它使用 SSL 的 RSA SSL-J 实现,以及一个使用 mod_ssl/openssl 为 SSL 配置的 apache 网络服务器

当 Java 程序尝试打开到 apache 服务器的 HttpsUrlConnection 时,出现错误 javax.net.ssl.SSLException: Fatal Alert received: Bad Record Mac

(异常堆栈跟踪不是很有用,因为 sslj.jar 被混淆了)

问题不是间歇性的。每次都会发生。

这是在我将 LogLevel 设置为调试后,来自 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 客户端看到了这个错误。调整 SSLProtocol在 apache 的虚拟主机配置中只允许 TLS 允许客户端连接。

关于java - apache 和 Java 之间的 "decryption failed or bad record mac",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11878952/

相关文章:

java - Spring 不归档属性文件

c++ - 如何配置 apache2 和 fastCGI 来运行我的 C++ 应用程序

PHP session 损坏

asp.net-mvc - 如果使用协议(protocol) "https"的安全页面,则不会从 CDN URL 加载 js 和 css

java - 当我运行 Codenameone 程序时,按钮未显示在模拟器中

java - 运行 Spring 单元测试的 AOP 问题

java - 在 Java 中 &= 和 |= 会短路吗?

xml - 如何在Spring XML中为Apache Camel的FlexibleAggregationStrategy设置“选择”表达式?

java - Java SSLSocket 和 HTML5 之间的通信

node.js - 在端口 3000 上运行的 node.js 服务器上的 https