如何在Java信任存储中导入jks证书

7
如何将.jks文件导入到Java安全的信任库中?我看到的所有教程都使用“.crt”文件。然而,我只有“.jks”文件,这也是我使用keytool命令生成的密钥库。我正在按照此教程进行操作。我已经成功生成了Java密钥库和密钥对,并为现有的Java密钥库生成了证书签名请求(CSR),但是我无法将根或中间CA证书导入到现有的Java密钥库中,并将签名的主要证书导入到现有的Java密钥库中,因为它正在寻找一个“.cert”文件。我在教程中漏掉了什么步骤吗?如果我只有“.jks”文件,那么我该如何信任证书?“.csr”文件有什么用途?请注意,我正在使用Windows。

你能说明一下你想要实现什么吗?你是想要搭建一个服务器吗?还是想要使用客户端认证?或者两者都需要?你在客户端和/或服务器上使用了特定的框架吗? - Maarten Bodewes
我没有使用任何框架。我正在尝试进行服务器身份验证。我需要验证我连接的服务器是否合法,给定证书。 - Arci
所以你有一个客户端,没有服务器,并且你已经得到了一个.jks密钥库来使用?如果你只是客户端,并且你没有使用客户端身份验证,那么你不需要生成密钥对。 - Maarten Bodewes
2个回答

13
".jks" 是信任库(truststore),如果您分配给JSSE,则应该将其作为信任库。您应该将CA的证书添加到该文件中。然后,软件将通过迭代证书来查找证书链。私钥应保留在(受密码保护的)".jks"文件中。
换句话说,您应该将证书导入".jks"而不是从其中导出证书。如果您的特定提供者的证书未包含在证书请求的响应中,则可能需要单独下载这些证书。您也可以从您喜欢的浏览器中导出它们。通常这些以X5.09 DER格式存储(这应与Java keytool兼容)。
步骤(一般性):
1. 生成密钥对和证书请求,存储在新的或现有的密钥库(.jks)中。 2. 发送证书请求进行签名,并获得以您请求的证书开头的证书链。 3. 将证书链导入带有私钥的密钥库中。 4. 生成新的或使用现有的密钥库,用于需要进行验证的方(使用SSL时至少一个或多个客户端),并导入证书链。 5. 信任上述密钥库中证书链中的证书,可能是最顶端的证书(“根”证书)。 6. 配置并测试参与方,例如使用带有私钥的密钥库的服务器和使用后一个密钥库的多个客户端。

谢谢你澄清这个问题!我曾经认为将证书添加到密钥库中意味着你实际上正在向JVM添加证书,而不仅仅是单个密钥库文件。你能教我如何在使用HttpsURLConnection时设置Java信任自签名证书,而不是将其设置为信任所有证书吗? - Arci
不需要,但我也没有必要。通常情况下,您可以通过别名配置Java应用程序使用特定的密钥。只有当Java能找到整个证书链时,它才会接受这个别名,但对于自签名证书,该链的长度为1。您只需要信任在另一端点的证书,那里您没有私钥。例如,在创建连接时,客户端将尝试查看是否可以建立到在特定时间有效的受信任证书的链。为此,您需要附加或创建密钥库,并导入和信任自签名证书。 - Maarten Bodewes
谢谢!是的,我需要它,因为我正在开发客户端。 - Arci
是的。谢谢,owlstead!但我还是缺少一些东西。我会先寻找解决方案,如果找不到,我就会发另一个问题。再次感谢! - Arci

6
#Use Keytool command to generate a self-signed certificate and install the certificate in Client Machine JDK Security Key store path.

# generate a certificate using JKS format keystore
keytool -genkey -alias selfrest -keyalg RSA -keypass pass123 -storetype JKS -keystore selfsigned.jks -storepass pass123 -validity 360 -keysize 2048

# To check the content of the keystore, we can use keytool again:
keytool -list -v -keystore selfsigned.jks

#Export Self signed certificate into .cer file
keytool -exportcert -alias selfrest -keystore selfsigned.jks -file selfsigned.cer

# (Run As Administrator- to open CMD.exe)
# Install self-signed certificate into Java JDK CA Certificate key store path
# to avoid giving certificate path in the client program.
keytool -import -alias selfrest -keystore "C:\Program Files\Java\jdk1.8.0_181\jre\lib\security\cacerts" -file selfsigned.cer

# List certificates stored in JDK Key store which you have just now imported into JDK Security path.
keytool -list -keystore "%JAVA_HOME%\jre\lib\security\cacerts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接