Maven构建时如何仅允许来自特定域名的自签名SSL证书?
可以实现,下面是两种常用的安全方案,既满足仅信任你们企业域名自签名证书的需求,也不会有全局关闭SSL校验的安全风险。
方案一:使用仅包含企业证书的专属信任库(最推荐)
操作步骤:
- 导出你们企业内部CA的根证书,或者
primary-nexus.JoeBloggsCompany.com、secondary-nexus.JoeBloggsCompany.com两个站点的证书,Chrome导出路径为:点击地址栏锁形图标→「证书」→「详细信息」→「导出」,选择Base64编码的X.509(.CER)格式存储。 - 用JDK自带的keytool工具,将导出的证书导入自定义的专属信任库,不需要修改JDK默认的cacerts文件,执行命令:
keytool -importcert -file 你导出的证书路径.cer -alias joebloggs-company-ca -keystore ./maven-company-truststore.jks -storepass 自定义密码
执行时按照提示确认导入即可。 - 运行Maven命令时指定该专属信任库即可:
mvn 构建命令 -Djavax.net.ssl.trustStore=./maven-company-truststore.jks -Djavax.net.ssl.trustStorePassword=自定义密码
这个方案的信任库仅信任你们企业的证书,所有外部站点的证书还是走正常校验逻辑,完全符合你的需求。
方案二:在settings.xml中为指定仓库单独配置信任库
如果不想每次执行命令都带参数,且使用的是Maven 3.2.5及以上版本,可以直接在Maven的settings.xml中给内部仓库单独绑定专属信任库,其他公网仓库不受影响:
在settings.xml的<servers>节点下添加如下配置:
<!-- 主Nexus仓库配置,id要和你配置的仓库id完全一致 --> <server> <id>primary-nexus</id> <configuration> <httpConfiguration> <all> <ssl> <trustStore>你的专属信任库路径/maven-company-truststore.jks</trustStore> <trustStorePassword>你设置的信任库密码</trustStorePassword> </ssl> </all> </httpConfiguration> </configuration> </server> <!-- 备Nexus仓库配置 --> <server> <id>secondary-nexus</id> <configuration> <httpConfiguration> <all> <ssl> <trustStore>你的专属信任库路径/maven-company-truststore.jks</trustStore> <trustStorePassword>你设置的信任库密码</trustStorePassword> </ssl> </all> </httpConfiguration> </configuration> </server>
注意配置中的<id>字段值必须和你pom.xml或者settings.xml中配置的内部仓库、镜像的id完全匹配才能生效。
说明
你提到的-Dmaven.wagon.http.ssl.insecure=true和-Dmaven.wagon.http.ssl.allowall=true参数是全局关闭所有SSL证书校验,任意域名的任意证书都会被放行,存在中间人攻击的风险,企业生产场景下确实不建议使用。
内容的提问来源于stack exchange,提问作者Muhamad Gafar
相关产品推荐
相关产品推荐

