java SSL和cert密钥库

deb*_*rah 156 java keystore

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

以某种方式指定密钥库后,如何指定用于向客户端验证服务器的证书?

Kar*_*ran 287

SSL属性通过系统属性在JVM级别设置.这意味着您可以在运行程序时设置它们(java -D ....)或者您可以通过执行System.setProperty在代码中设置它们.

您必须设置的具体键如下:

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

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

javax.net.ssl.trustStore - 包含此应用程序进程信任的CA证书集合(信任库)的Java密钥库文件的位置.在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.

  • 链接到引用它的文档会更合适.我猜是这样的:http://fusesource.com/docs/broker/5.3/security/SSL-SysProps.html (15认同)
  • 对于可能要编辑系统信任库的任何人,默认密码为"changeit":https://community.oracle.com/thread/1540678?start = 0&tstart = 0 (10认同)
  • 官方文档应该是JSSE参考指南:http://docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#Customization (4认同)
  • JDK7 http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#Customization现在更合适. (3认同)

Dav*_*veH 106

System.setProperty("javax.net.ssl.trustStore", path_to_your_jks_file);
Run Code Online (Sandbox Code Playgroud)

  • System.setProperty( "javax.net.ssl.trustStore中",path_to_your_jks_file); (17认同)
  • 在Windows上,指定的路径名​​必须使用正斜杠/,代替反斜杠\. (4认同)
  • 有谁知道如何在Windows框中引用它?System.setProperty( "javax.net.ssl.trustStore中", "C:\\ Program Files文件(x86)的\\ \\的Java \\ jdk1.7.0_21 \\的jre的lib \\ \\安全的cacerts"); 不适合我:( (3认同)
  • 还有一个密码系统属性 (javax.net.ssl.trustStorePassword)。也可以作为 JVM 参数传递 -Djavax.net.ssl.trustStore=clientTrustStore.key -Djavax.net.ssl.trustStorePassword=customPassword 请参阅 https://docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient。 html (2认同)
  • @james2611nov:如果您在调用 HTTPS 端点时收到 HTTP 403 错误(或任何其他 HTTP 响应),则意味着您已成功通过 TLS 设置:仅在设置 TLS 通道后才会发生 HTTP 交互(否则他们就无法受到保护)。所以——是的,这个答案显然对你有用。:-) (2认同)

小智 17

只是提醒一句.如果您尝试在Java 9之后打开现有的JKS密钥库,则需要确保提及以下属性,其值为"JKS":

javax.net.ssl.keyStoreType
javax.net.ssl.trustStoreType
Run Code Online (Sandbox Code Playgroud)

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


Car*_*cia 12

首先,有两种密钥库.

个人一般

应用程序将使用启动或系统默认中指示的应用程序.

如果JRE或JDK正在运行,或者您检查个人或"全局"文件夹,它将是一个不同的文件夹.

它们也是加密的

简而言之,路径将是:

$JAVA_HOME/lib/security/cacerts 对于"一般人"来说,他拥有当局的所有CA并且非常重要.

  • 类型是“密钥库”和“信任库”。请不要发明多余的术语。 (3认同)

小智 9

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

-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks
Run Code Online (Sandbox Code Playgroud)

在我的apache spark应用程序中,我曾经使用--conf选项和extraJavaoptionsspark-submit 提供certs和keystore的路径,如下所示

--conf 'spark.driver.extraJavaOptions= 
-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks' 
Run Code Online (Sandbox Code Playgroud)