我可以避免在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参考指南中的示例所述。