通过经过身份验证的 HTTPS 访问远程存储库的指南

本文档描述了如何配置 Maven 以访问位于 HTTPS 服务器后面的远程存储库,该服务器需要使用证书进行客户端身份验证。

问题

有一个 Maven 存储库https://my.server.com/maven。此服务器仅服务于通过 SSL 协议通过由批准的证书颁发机构的证书签署的有效证书进行身份验证的客户端,我们称之为CACert. 在最简单的情况下,服务器由已识别的用户社区(例如公司内部网)在内部使用,服务器的证书是证书颁发机构,因为服务器仅在内部使用。

因此,我们假设我们可以访问存储在名为以下文件的 X.509 格式的受信任证书:

   /somewhere/in/filesystem/CACert.cert

客户端的证书已通过本文档中未描述的某种方式以 PKCS#12 格式颁发,这是浏览器(至少 Firefox 和 Internet Explorer)接受导入其密钥库的格式。此文件名为:

   /home/directory/mycertificate.p12

我们假设它在启动 maven 时可以访问。此文件包含客户端的私钥,这可能是非常敏感的信息,因此通过密码保护:

   CeRtPwD

通过pom.xml文件引用远程存储库:

maven.repo.remote=https://my.server.com/maven,http://www.ibiblio.org/maven

解决方案

为了让 maven 使用这个存储库,我们应该采取以下步骤:

  1. 使用 Oracle 的keytool创建一个存储来保存服务器的证书,
  2. 定义 HttpClient 用于查找密钥和证书的属性

存储证书

以下命令行将证书颁发机构的证书导入到名为trust storetrust.jks的 JKS 格式密钥库中。

$> keytool -v -alias mavensrv -import \
     -file /somewhere/in/filesystem/CACert.cert\
      -keystore trust.jks
Enter keystore password:
Owner: ....
Issuer: ....
Serial number: ....
Valid from: Mon Feb 21 22:34:25 CET 2005 until: Thu Feb 19 22:34:25 CET 2015
Certificate fingerprints:
         MD5:  .......
         SHA1: .....
Trust this certificate? [no]:  yes
Certificate was added to keystore
[Storing trust.jks]
$>

请注意,应该可以导入仅信任一个根证书的完整证书链,但作者没有对其进行测试。

设置属性

必须在 Maven 启动时设置以下属性,才能在 HttpClient 启动时访问。

javax.net.ssl.trustStore
存储受信任证书的密钥库的路径
javax.net.ssl.trustStoreType
此存储的存储类型,可能是jks(默认)或pkcs12
javax.net.ssl.trustStorePassword
保护商店的密码
javax.net.ssl.keyStore
存储用户私钥的密钥库的路径
javax.net.ssl.keyStoreType
此存储的存储类型,可能是jks(默认)或pkcs12
javax.net.ssl.keyStorePassword
保护商店的密码

并非所有属性都必须根据您的精确设置进行设置:存储类型可能保留为默认值,密码可能为空。

它们可以在 maven 的命令行、.mavenrc文件或MAVEN_OPTS环境变量中设置。对于本文档中定义的设置,这里是一个示例.mavenrc文件:

MAVEN_OPTS="-Xmx512m -Djavax.net.ssl.trustStore=trust.jks \
                     -Djavax.net.ssl.trustStorePassword=  \
                     -Djavax.net.ssl.keyStore=/home/directory/mycertificate.p12 \
                     -Djavax.net.ssl.keyStoreType=pkcs12 \
                     -Djavax.net.ssl.keyStorePassword=XXXXXX"

链接

以下链接可能有助于理解 Java 中的 SSL 基础设施管理: