Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我们应该将KeyStore和TrustStore指向同一个.jks文件吗?_Java_Keytool - Fatal编程技术网

Java 我们应该将KeyStore和TrustStore指向同一个.jks文件吗?

Java 我们应该将KeyStore和TrustStore指向同一个.jks文件吗?,java,keytool,Java,Keytool,我正在使用SSL握手连接到URL。 为此,我生成了一个.csr文件并对其进行了签名。 签名后,我创建了一个my.jks文件,其中包含3个条目 已签名客户端证书 私钥 CA 我使用jetty作为服务器,并专门将密钥库和信任库设置为相同的jks文件,如下所示 -Djavax.net.ssl.keyStore=/home/keystore/my.jks -Djavax.net.ssl.keyStorePassword=changeit -Djavax.net.ssl.trustStore=/home/

我正在使用SSL握手连接到URL。 为此,我生成了一个.csr文件并对其进行了签名。 签名后,我创建了一个my.jks文件,其中包含3个条目

  • 已签名客户端证书
  • 私钥
  • CA
  • 我使用jetty作为服务器,并专门将密钥库和信任库设置为相同的jks文件,如下所示

    -Djavax.net.ssl.keyStore=/home/keystore/my.jks
    -Djavax.net.ssl.keyStorePassword=changeit
    -Djavax.net.ssl.trustStore=/home/keystore/my.jks
    -Djavax.net.ssl.trustStorePassword=changeit
    
    它很好用。但这是正确的方法吗? 我认为密钥库应该包含客户端证书和私钥,信任库应该包含CA

    “javax.net.ssl.SSLHandshakeException: sun.security.validator.validator异常:PKIX路径生成失败: sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效证书路径“


    请给我一些建议。

    关于你问题的第一部分,我认为基本上涵盖了它。简而言之,是的,您可以将两者指向同一个文件,不,这不是最佳做法。至于您得到的错误,可能有很多原因,但是您可以尝试从JAVA_HOME/jre/lib/security将CA添加到cacerts文件中。这使得它对所有JAVA应用程序都可用。

    否。信任库只包含公共数据:您信任的CA的公共证书。密钥库包含私钥及其证书:您的数字身份。他们甚至可能被不同的人控制。不要混淆它们的功能。

    如果您希望对证书进行自签名(仅当您将其用于服务器内部通信而不交换任何个人/敏感信息时):

    1) 使用-certreq生成CSR

    keytool-certreq-alias keyAlias-keystore locationPk-storepass yourpass-file myowncertrequest.csr

    2) 使用上面的csr生成证书:

    keytool-gencert-infle myowncertrequest.csr-alias keyAlias-keystore location pk-storepass yourpass-outfile myownsignedcert.cer

    3) 将此导入“单独”信任存储

    keytool-import-trustcacerts-alias myown-file myownsignedcert.cer-keystore intra_server_truststore-storepass goodpassword


    这将创建一个自定义信任存储,该存储只在您自己的域中使用,并用于一些基本的身份验证和数据交换。但是,如果要将服务暴露给外部世界,请使用适当的CA签署这些证书。

    可能会将此问题转移到?从您的描述中不清楚导致该异常的实际原因。是在启动期间吗?当建立到URL的连接时?需要更多的上下文。@laz是的,在建立连接时是这样。要清楚,你引用的@Bruno的答案实际上并不支持你的“是”的答案。他的答案的最后一部分:在某些情况下,它们可以是同一个存储,尽管使用不同的存储(尤其是基于文件的存储)通常是更好的做法。告诉我你可以把两者都放在一个文件里,虽然这不是最好的做法。当我照你说的做时,我会得到“握手例外”。我的问题中提到了这一点。有什么建议吗?我想说你做得不对。本地信任库需要信任对等方的密钥库。您不需要生成CSR。只需使用
    -genkey
    选项即可。生成密钥对和证书的。一步而不是两步。