Maven依赖JAR损坏(error in opening zip file)与内部HTTPS仓库CA证书问题求助
从你描述的现象和日志来看,这确实是内部HTTPS仓库的CA证书不被Maven信任导致的核心问题,咱们一步步拆解原因和解决方案:
问题根源分析
当Maven访问使用内部CA(自定义证书颁发机构)签发证书的HTTPS仓库时,如果Maven所依赖的JVM信任库中没有包含这个CA的证书,Maven在尝试下载依赖的POM/JAR文件时会触发证书验证失败。此时仓库返回的不是正常的依赖文件,而是一个HTML格式的错误页面(这就是日志里expected <!DOCTYPE的由来)——这种错误页面被当成POM/JAR下载到本地仓库后,自然会出现校验和失败、打开zip文件错误的问题。
而你手动下载能解决,是因为你的浏览器可能已经信任了这个内部CA(比如之前手动导入过证书),所以能获取到正确的JAR文件,替换本地仓库里的损坏文件后Maven就能正常读取了。
解决方案步骤
1. 导出内部CA的根证书
打开浏览器访问仓库的POM地址(也就是日志里的https://<host>:<port>/repository/my-maven-repo/path/to/the/artifact/version/dependency-version.pom),当出现NET::ERR_CERT_AUTHORITY_INVALID错误时:
- 点击地址栏的锁图标 → 选择“证书”选项
- 在证书详情里找到根CA证书(通常是最顶层的那个)
- 将其导出为Base64编码的.crt格式文件(比如命名为
internal-ca.crt)
2. 将CA证书导入到Maven使用的JVM信任库
首先确认Maven使用的JDK路径:执行mvn -v命令,查看输出里的Java version对应的JDK安装目录。
然后使用keytool命令导入证书(默认的JVM信任库密码是changeit):
keytool -import -trustcacerts -alias internal-ca -file /你保存证书的路径/internal-ca.crt -keystore /你的JDK路径/jre/lib/security/cacerts
执行过程中会提示是否信任该证书,输入yes确认即可。
3. 清理本地仓库的损坏文件
手动删除本地仓库中对应依赖的目录(也就是错误提示里的${user.home}\my-repository\path\to\the\artifact\version\),避免Maven复用之前下载的损坏文件。
4. 重新执行Maven构建
运行mvn clean install,此时Maven应该能正常从内部仓库下载到正确的POM和JAR文件,编译失败的问题就能解决了。
可选:不修改全局JVM信任库的替代方案
如果你不想修改全局的JVM信任库,可以在项目的.mvn/maven.config中添加JVM参数,指定自定义的信任库(你可以复制一份默认的cacerts,导入内部CA证书后作为自定义信任库):
-Djavax.net.ssl.trustStore=/path/to/your/custom/cacerts -Djavax.net.ssl.trustStorePassword=changeit
另外提一句:你的POM里的插件版本(比如maven-compiler-plugin 2.3.2、maven-war-plugin 2.1.1)比较老旧,虽然不是当前问题的根源,但长期来看建议升级到较新的稳定版本,避免其他潜在问题。
备注:内容来源于stack exchange,提问作者Ceddaerrix

