我的java程序如何知道包含证书的密钥库在哪里?或者,我如何告诉我的java程序在哪里查找密钥库?
以某种方式指定密钥库后,如何指定用于向客户端验证服务器的证书?
答案 0 :(得分:275)
通过系统属性在JVM级别设置SSL属性。这意味着您可以在运行程序时设置它们(java -D ....)或者您可以通过执行System.setProperty在代码中设置它们。
您必须设置的具体键如下:
javax.net.ssl.keyStore - 位置 包含的Java密钥库文件 申请流程自己的证书 和私钥。在Windows上, 指定的路径名必须使用forward 斜杠,/,代替反斜杠。
javax.net.ssl.keyStorePassword - 密码 从中访问私钥 指定的密钥库文件 javax.net.ssl.keyStore。这个密码 使用两次:解锁密钥库 文件(存储密码),以及解密 存储在密钥库中的私钥 (密码密码)。
javax.net.ssl.trustStore - 位置 包含的Java密钥库文件 受信任的CA证书集合 通过这个申请程序(信任 商店)。在Windows上,指定 pathname必须使用正斜杠
/
, 代替反斜杠,\
。如果信托商店位置不是 使用此属性指定的 SunJSSE实现搜索 并在中使用密钥库文件 以下位置(按顺序):
$JAVA_HOME/lib/security/jssecacerts
- 醇>
$JAVA_HOME/lib/security/cacerts
javax.net.ssl.trustStorePassword - 解锁密钥库文件的密码 (商店密码)指定
javax.net.ssl.trustStore
。javax.net.ssl.trustStoreType - (可选) 对于Java密钥库文件格式,这个 property的值为jks(或JKS)。 您通常不会指定此项 property,因为它的默认值是 已经jks。
javax.net.debug - 要切换 在记录SSL / TLS层时,设置 这个属性为ssl。
答案 1 :(得分:96)
System.setProperty("javax.net.ssl.trustStore", path_to_your_jks_file);
答案 2 :(得分:11)
首先,有两种密钥库。
个人和一般
应用程序将使用启动时或系统默认情况下指示的那个。
如果JRE或JDK正在运行,或者您检查个人或“全局”文件夹,它将是一个不同的文件夹。
它们也是加密的
简而言之,路径将如下:
$JAVA_HOME/lib/security/cacerts
代表“一般人”,他拥有当局的所有CA并且非常重要。
答案 3 :(得分:9)
请注意。如果要尝试从Java 9开始打开现有的JKS密钥库,则需要确保也提及以下属性,其值为“ JKS”:
javax.net.ssl.keyStoreType
javax.net.ssl.trustStoreType
原因是java.security文件中规定的默认密钥库类型已从Java 9开始的jks更改为pkcs12。
答案 4 :(得分:7)
您还可以使用-D
属性在运行时提及路径
-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks
在我的apache spark应用程序中,我曾经使用--conf
选项提供证书和密钥库的路径,并在spark-submit中提供extraJavaoptions
,如下所示
--conf 'spark.driver.extraJavaOptions=
-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks'