[英]JDBC+SSL: Bundling a CA cert, client cert and client into a single keystore file
Google Cloud SQL通过为您生成服务器ca-cert.pem
, client-cert.pem
和client-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.