Maven对接Nexus时TLS握手成功后丢弃会话无法下载构件
问题背景
当前在物理隔离网络环境下排查Maven无法从本地Sonatype Nexus服务器下载构件的问题,所有手动转录内容若存在笔误敬请谅解;故障排查由系统管理员负责推进,排查人员对Maven技术栈熟悉度有限。
环境配置
- 服务端:Sonatype Nexus 3.40.1,前端采用Apache httpd/2.4.6 mod_ssl提供反向代理服务;服务端证书由所有相关主机均已接入的FreeIPA/IdM服务器签发,客户端可正常识别该证书有效性。
- 客户端:Maven 3.5.0,Java 1.8.0_332,所有涉及主机操作系统均为RHEL 7.9。
复现操作
执行开发人员提供的Nexus连通性测试命令时出现故障,命令如下:
mvn -DgroupId=commons-io -DartifactId=commons-io -Dversion1.4 dependency:get --debug -Djavax.net.debug=all >& debug
故障日志
查看输出的debug日志可见,Maven与服务端完成完整TLS握手流程后,在即将开始下载构件阶段多次出现如下日志记录:
[DEBUG] Secure connection established
[DEBUG] negotiated protocol: TLSv1.2
[DEBUG] negotiated cipher suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
[DEBUG] peer principal: CN=repo.{my_domain}, O={MY_DOMAIN}
[DEBUG] http-outgoing-0: Shutdown connection
[DEBUG] Connection discarded
[DEBUG] Connection released: [id: 0][route: {s}-> https://repo.{my_domain}:9000][total kept alive: 0; route allocated: 0 of 20; total allocated: 0 of 40]
[DEBUG] Writing tracking file ...
[WARNING] Failed to retrieve plugin descriptor for ...
已验证结论
- 仅禁用HTTPS时Maven可正常对接Nexus服务,但该方案不符合环境安全要求无法落地
- 使用Firefox、curl工具可直接从Nexus服务器正常下载构件,无连通性异常
根因定位
核心问题是Java 8默认启用的JCE密钥长度限制,和日志现象完全匹配:
- 日志显示协商的加密套件为
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,使用256位AES加密算法 - RHEL 7源自带的OpenJDK 1.8.0默认搭载受限强度JCE策略,最高仅支持128位长度的AES密钥
- TLS握手阶段完成套件协商后会打印
Secure connection established日志,后续初始化批量加密上下文时才会触发JCE密钥长度校验,校验失败后Java加密层直接抛出内部异常,Maven依赖的Apache HTTP客户端没有捕获该底层异常,会直接关闭丢弃连接,因此日志中不会打印明确的加密错误,仅能看到连接被释放、插件描述符获取失败的警告 - Firefox、curl调用系统OpenSSL库完成TLS加解密,不受Java JCE策略限制,因此访问正常。
另外测试命令存在笔误:-Dversion1.4缺少等号,正确写法为-Dversion=1.4,该笔误不会导致本次TLS连接异常,但会导致构件坐标解析失败,测试时需要修正。
修复步骤
- 安装RHEL官方源提供的无限制JCE策略包,无需手动替换JRE目录下的jar文件:
yum install -y java-1.8.0-openjdk-jce-unlimited - 验证JCE策略是否生效,执行如下命令,输出值为
2147483647即代表无限制策略启用成功,若输出为128则需要检查JDK安装路径、默认Java版本是否正确:jrunscript -e 'print(javax.crypto.Cipher.getMaxAllowedKeyLength("AES"));' - 清理Maven本地缓存的失败标记与不完整构件,重新执行测试命令即可:
rm -rf ~/.m2/repository/.cache/ rm -rf ~/.m2/repository/commons-io/
兜底排查项
如果完成上述操作后故障仍存在,依次检查以下配置:
- 开启Apache反向代理的debug级访问日志、错误日志,确认Maven发起的请求是否到达Apache、服务端返回的状态码是否正常,排查是否存在针对Java客户端UA的拦截规则
- 检查Maven配置文件
~/.m2/settings.xml中的镜像、代理配置,确认配置的Nexus地址与curl测试用的HTTPS地址、端口完全一致 - 临时在Apache SSL配置中调整加密套件优先级,优先使用128位AES的套件(如
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256),重启httpd后测试,如果此时访问正常即可100%确认是JCE策略问题。
内容的提问来源于stack exchange,提问作者cdschr1

