Java SSL和证书密钥库


165

我的Java程序如何知道包含证书的密钥库在哪里?或者,如何告诉我的Java程序在哪里寻找密钥库?

在以某种方式指定了密钥库之后,如何指定用于对服务器进行身份验证的证书?


最好避免使用System.setProperty设置(以下方法),请参见:docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/…,如何为SSLContext构造KeyManagerFactory
Marek- A-19年

Answers:


111
System.setProperty("javax.net.ssl.trustStore", path_to_your_jks_file);

4
有谁知道如何在Windows框上引用它?System.setProperty(“ javax.net.ssl.trustStore”,“ C:\\ Program Files(x86)\\ Java \\ jdk1.7.0_21 \\ jre \\ lib \\ security \\ cacerts”)不是为我工作:(
simgineer 2013年

4
在Windows上,指定的路径名​​必须使用正斜杠/代替反斜杠\。
Droidman

这个工作了吗?我在“ jks”文件包含CA证书的地方使用了相同的代码。但是我仍然得到javax.xml.ws.WebServiceException:org.apache.axis2.AxisFault:传输错误:403错误:通过SOAP生成的存根调用客户端代码时,出现了禁止的错误。有任何想法吗?
james2611nov

1
还有一个密码系统属性(javax.net.ssl.trustStorePassword)。也可以作为JVM参数传递-Djavax.net.ssl.trustStore = clientTrustStore.key -Djavax.net.ssl.trustStorePassword = customPassword参考 docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
Kingsly

@ james2611nov:如果您收到调用HTTPS端点的HTTP 403错误(或其他任何HTTP响应),则意味着您成功通过了TLS设置:仅在设置TLS通道后,HTTP交互才会发生(否则它们将无法得到保护)。所以-是的,这个答案显然对您有用。:-)
鲁阿克

295

SSL属性是通过系统属性在JVM级别设置的。这意味着您可以在运行程序时设置它们(java -D ....),也可以通过执行System.setProperty在代码中对其进行设置。

您必须设置的特定键如下:

javax.net.ssl.keyStore-包含应用程序进程自己的证书和私钥的Java密钥库文件的位置。在Windows上,指定的路径名​​必须使用正斜杠/代替反斜杠。

javax.net.ssl.keyStorePassword-从javax.net.ssl.keyStore指定的密钥库文件访问私钥的密码。此密码使用了两次:解锁密钥库文件(存储密码),以及解密存储在密钥库中的私钥(密钥密码)。

javax.net.ssl.trustStore -Java密钥库文件的位置,该文​​件包含此应用程序进程信任的CA证书的集合(信任库)。在Windows上,指定的路径名​​必须使用正斜杠/代替反斜杠\

如果未使用此属性指定信任存储位置,则SunJSSE实现将在以下位置(按顺序)搜索并使用密钥存储文件:

  1. $JAVA_HOME/lib/security/jssecacerts
  2. $JAVA_HOME/lib/security/cacerts

javax.net.ssl.trustStorePassword- 解锁由指定的密钥库文件(存储密码)的密码 javax.net.ssl.trustStore

javax.net.ssl.trustStoreType-(可选)对于Java密钥库文件格式,此属性的值为jks(或JKS)。通常不指定此属性,因为其默认值已经是jks。

javax.net.debug要打开SSL / TLS层的日志记录,请将此属性设置为ssl。


17
链接到引用该文档的文档会更合适。我想是这样的:fusesource.com/docs/broker/5.3/security/SSL-SysProps.html
Bruno,



11
对于可能要编辑系统信任库的任何人,默认密码为“ changeit”:community.oracle.com/thread/1540678?
start=0&tstart=0

为javax.net.ssl.trustStorePassword道具+1。我已经逛了一会儿了,这是第一次提到它。
jgreen

22

请注意。如果要尝试从Java 9开始打开现有的JKS密钥库,则需要确保也提及以下属性,其值为“ JKS”:

javax.net.ssl.keyStoreType
javax.net.ssl.trustStoreType

原因是java.security文件中规定的默认密钥库类型已从Java 9起从jks更改为pkcs12。


11

首先,有两种密钥库。

个人一般

该应用程序将使用系统启动时指示的值或系统的默认值。

如果正在运行JRE或JDK,或者您检查了个人或“全局”文件夹,则它将是另一个文件夹。

它们也被加密

简而言之,路径将类似于:

$JAVA_HOME/lib/security/cacerts 对于“通用机构”而言,拥有所有机构的CA,这一点非常重要。


类型为“密钥库”和“信任库”。请不要发明多余的术语。
罗恩侯爵

9

您还可以使用-D以下属性在运行时提及路径

-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks

在我的apache spark应用程序中,我曾经使用--confoption和extraJavaoptionsspark-submit 来提供证书和密钥库的路径,如下所示

--conf 'spark.driver.extraJavaOptions= 
-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks' 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.