我可以避免在JSSE的命令行上放置密钥库密码吗?

我们正在使用Maven 2并使用SSL客户端身份validation保护maven存储库管理器。 为了让Maven访问存储库,必须将以下系统属性传递给Java:

javax.net.ssl.trustStore中= trust.jks
javax.net.ssl.trustStorePassword =
javax.net.ssl.keyStore = keystore.p12
javax.net.ssl.keyStoreType = PKCS12
javax.net.ssl.keyStorePassword =

有关详细信息,请参阅此迷你指南 。

为了在Maven中设置这些系统属性,我必须使用MAVEN_OPTS环境变量(或直接在命令行上传递它们)。 无论哪种方式,当Maven实际执行时,所有这些属性都可以被系统上的其他用户看到(通过ps),包括我的密钥库密码。

有没有办法设置这些属性,以便密码不会在命令行上公开?

OSX

我在OSX上提出的解决方案是以下.mavenrc 。 它使用python脚本访问钥匙串中的密码,以便打开客户端证书,然后使用该随机密码生成随机密码和临时证书。

将它放在~/.mavenrc ,并将您的客户端证书添加到OSX钥匙串中。 确保将MAVEN_CLIENT_CERT设置为客户端证书的位置。

〜/ .mavenrc

 export MAVEN_CLIENT_CERT= # Retrieve secret from keychain export SECRET=$(python </dev/null; do sleep 1; done; rm -f $pemfile; rm -f $p12file;" & MAVEN_OPTS="$MAVEN_OPTS -Djavax.net.ssl.keyStore=$p12file -Djavax.net.ssl.keyStoreType=pkcs12 -Djavax.net.ssl.keyStorePassword=$PASSPHRASE" 

Linux的

在Linux上,以下.mavenrc将与gnome密钥环一起使用(确保将证书密码添加到您的登录密钥环并设置id变量KEYRING_ID ):

〜/ .mavenrc

 MAVEN_CLIENT_CERT= export KEYRING_NAME="login" export KEYRING_ID= # Try to get secret from the gnome keyring export SECRET=$(python </dev/null; do sleep 1; done; rm -f $pemfile; rm -f $p12file;" & MAVEN_OPTS="$MAVEN_OPTS -Djavax.net.ssl.keyStore=$p12file -Djavax.net.ssl.keyStoreType=pkcs12 -Djavax.net.ssl.keyStorePassword=$PASSPHRASE" 

您可以在Maven设置文件中定义这些属性。 它们的访问方式与在命令行中提供它们时的方式相同。 以下是Maven设置文件的示例:

   repo-ssl  trust.jks SET_TRUSTSTORE_PASSWORD keystore.p12 pkcs12 SET_KEYSTORE_PASSWORD     repo-ssl  

虽然我没有做同样的事情,但你在处理秘密时我已经使用了同样的技术。

在OSX上,你可以使用你的钥匙串作为密钥库(据我所知,仍然存在一个错误,所以它只有在只有一个“身份”时才有效,这是一个cert +私钥的组合)。

使用它,使用-Djavax.net.ssl.keyStore=NONE-Djavax.net.ssl.keyStoreType=KeychainStore-Djavax.net.ssl.keyStorePassword=-

然后,钥匙串将提示您在需要时批准使用私钥。

是的,您可以在获取初始SSLContext之前在代码中使用System.setProperty() ,或者您可以解决创建自己的KeyManager等等的痛苦和痛苦,如JSEE参考指南中的示例所述。