【问题标题】:How to generate Java certificates (keystore and truststore) for two way SSL starting from X509 certificates如何从 X509 证书开始为双向​​ SSL 生成 Java 证书(密钥库和信任库)
【发布时间】:2023-02-11 00:37:33
【问题描述】:

我已经生成了 OpenSSL 自签名证书:

根 CA:cacert.crt(根 CA 证书)和 root_key.pem(用于 根私钥)。

客户端:client_cert.crt(客户端证书)和 client_key.pem(私钥)。

服务器:server_cert.crt(服务器证书)和 server_key.pem(私钥)。

客户端和服务器证书都使用根密钥签名。

据我了解,对于两种方式的 SSL,服务器信任库应包含客户端证书,客户端信任库应包含服务器证书。

我的问题是如何使用 keytool 生成从这些证书/密钥开始的两对客户端/服务器信任库/密钥库

【问题讨论】:

  • 这不是编程或开发,但对于 CA 颁发的证书,每一方的信任库应包含根 CA 证书,而不是对等方的证书;只有自签名证书才需要对等证书在信任库中。然而每一方的密钥库应该包含自己的私钥和证书以及 CA 证书(又名链).你不能用 keytool 做到这一点,你必须使用 OpenSSL 或类似 keystore-explorer 的东西;关于每一个都有很多答案——尽管只有一些被更新以反映新 OpenSSL 和旧 Java 的问题,请参阅(我的)stackoverflow.com/questions/72412346
  • 这不是编程问题,但它直接链接到编程/测试,如果您编写处理 SSL 的代码,您将需要对其进行测试。

标签: java ssl ssl-certificate keytool


【解决方案1】:

经过一番研究,我发现了以下步骤:

对于客户端密钥库:

openssl pkcs12 -export -out client.pfx -inkey client_key.pem -in client_cert.crt

对于客户端信任库:

keytool -import -file cacert.crt -alias cacert -keystore ClientTruststore
keytool -import -file client_cert.crt -alias servercert -keystore ClientTruststore

对于服务器密钥库:

openssl pkcs12 -export -out server_key.p12 -inkey server_key.pem -in server_cert.crt
SET PASSWORD=MyPassword
keytool -genkey -alias server -keyalg RSA -validity 3650 -keystore server.keystore -storepass %PASSWORD% -keypass %PASSWORD% 
keytool -importcert -alias rootCA -keystore server.keystore -storepass %PASSWORD% -keypass %PASSWORD% -file cacert.crt
keytool -v -importkeystore -srckeystore server_key.p12 -srcstoretype PKCS12 -destkeystore server.keystore -deststoretype JKS -deststorepass %PASSWORD%

对于服务器信任库:

keytool -import -file cacert.crt -alias cacert -keystore ServerTruststore
keytool -import -file client_cert.crt -alias client -keystore ServerTruststore

我通过运行程序使用非常简单的 SSL 客户端/服务器对其进行了测试:

java -Djavax.net.ssl.keyStore=server.keystore -Djavax.net.ssl.keyStorePassword=MyPassword -Djavax.net.ssl.trustStore=ServerTruststore -Djavax.net.ssl.trustStorePassword=MyPassword -jar HelloServer.jar
java -Djavax.net.ssl.keyStore=client.pfx -Djavax.net.ssl.keyStorePassword=MyPassword -Djavax.net.ssl.trustStore=ClientTruststore -Djavax.net.ssl.trustStorePassword=MyPassword -jar HelloClient.jar

它工作正常。 欢迎提出任何改进建议。

【讨论】:

    猜你喜欢
    • 2011-08-17
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多