【问题标题】:SSL and cert keystoreSSL 和证书密钥库
【发布时间】:2011-08-17 19:05:31
【问题描述】:

我的 Java 程序如何知道包含证书的密钥库在哪里?

或者:我如何告诉我的 Java 程序去哪里寻找密钥库?

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

【问题讨论】:

标签: java keystore


【解决方案1】:
System.setProperty("javax.net.ssl.trustStore", path_to_your_jks_file);

【讨论】:

  • 任何人都知道如何在 windows 框中引用这个? System.setProperty("javax.net.ssl.trustStore", "C:\\Program Files (x86)\\Java\\jdk1.7.0_21\\jre\\lib\\security\\cacerts");不适合我:(
  • 在 Windows 上,指定的路径名​​必须使用正斜杠 /,而不是反斜杠 \。
  • 这行得通吗?我使用了相同的代码,其中我的“jks”文件包含 CA 证书。但是当我通过 SOAP 生成的存根调用客户端代码时,我仍然得到 javax.xml.ws.WebServiceException: org.apache.axis2.AxisFault: Transport error: 403 Error: Forbidden 错误。有什么想法吗?
  • 还有一个密码系统属性(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
  • @james2611nov:如果您在调用 HTTPS 端点时遇到 HTTP 403 错误(或任何其他 HTTP 响应),那么这意味着您成功通过了 TLS 设置:仅发生 HTTP 交互一旦设置了 TLS 通道(否则无法保护它们)。所以 - 是的,这个答案显然对你有用。 :-)
【解决方案2】:

SSL 属性是通过系统属性在 JVM 级别设置的。这意味着您可以在运行程序时设置它们(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 上,指定的 路径名必须使用正斜杠,/, 代替反斜杠,\

如果信任存储位置不是 使用此属性指定, 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。

【讨论】:

【解决方案3】:

首先,有两种密钥库。

个人一般

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

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

它们也被加密了

简而言之,路径会是这样的:

$JAVA_HOME/lib/security/cacerts 代表“一般人”,他拥有权威的所有 CA,非常重要。

【讨论】:

  • 类型为“keystore”和“truststore”。请不要发明多余的术语。
【解决方案4】:

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

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

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

--conf 'spark.driver.extraJavaOptions= 
-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks' 

【讨论】:

    【解决方案5】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-01-02
      • 2018-08-18
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 2016-07-10
      相关资源
      最近更新 更多