繁体   English   中英

JDBC + SSL:将CA证书,客户端证书和客户端捆绑到一个密钥库文件中

[英]JDBC+SSL: Bundling a CA cert, client cert and client into a single keystore file

Google Cloud SQL通过为您生成服务器ca-cert.pemclient-cert.pemclient-key.pem来支持SSL连接。 我设法通过以下步骤将Java客户端连接到Cloud SQL:

1)将服务器CA证书导入到信任库文件中:

keytool -import -alias mysqlServerCACert -file ca-cert.pem -keystore truststore

2)将客户端证书和客户端密钥捆绑到一个pkcs12文件中:

openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -out client.p12 -name clientalias -CAfile ca-cert.pem

3)将pkcs12导入密钥库文件:

keytool -importkeystore -deststorepass keystore -destkeystore keystore -srckeystore client.p12 -srcstoretype PKCS12 -srcstorepass keystore -alias clientalias

4)告诉JVM使用我的信任库和密钥库:

-Djavax.net.ssl.keyStore=/path/to/my/keystore \
-Djavax.net.ssl.keyStorePassword=keystore \
-Djavax.net.ssl.trustStore=/path/to/my/truststore \
-Djavax.net.ssl.trustStorePassword=truststore

所有这些都可以,但是不幸的是,它阻止了来自其他客户端库的出站HTTPS连接-在我的情况下是Firebase Java客户端库。 问题是我的-Djavax.net.ssl.trustStore参数覆盖了与JDK捆绑在一起的默认cacerts文件。

我似乎有两个选择。 一种不理想的选择是,使用特定于操作系统和特定于JDK的命令,将我的服务器CA证书导入到每台生产和开发计算机上的JDK的cacerts文件中。 对于实际的生产设置,此选项似乎很麻烦。

另一个选择是将服务器CA证书和客户端证书捆绑到一个(本地)信任链中,然后Java将使用该信任链来验证我的客户端密钥。 我很确定,从我读到的内容来看,这是有可能的,但是我不知道所需要的咒语。

我的猜测是,我应该使用单个openssl命令创建一个包含正确顺序的包含服务器CA证书,客户端证书和客户端密钥的pkcs12软件包,然后使用keytool将其导入到新的密钥库中。 我将省略-D.../trustStore JVM参数,而仅指定keystore参数。 Java将对我的Cloud SQL客户端密钥使用本地CA信任链,但对于所有其他SSL协商,将回退到全局cacerts文件。

这可能吗? 如果不能直接作为单个pkcs12,那么是否还有其他一些步骤可以将它们全部放入单个密钥库中,而无需使用信任库?

将默认的JRE cacerts文件复制到新的信任库,并将服务器证书添加到该信任库。 适用于所有客户。 使它成为构建步骤,并在每次JRE升级时重复一次,因此您不会错过默认cacerts.中的证书更改cacerts.

当然,如果服务器证书由公认的CA正确签名,则无需将其导入任何地方或使用自定义信任库。 如果它不是由公认的CA签名的,则应该签名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM