保护 JDBC 连接时的证书和密钥库配置
Certificate and KeyStore Configuration When Securing JDBC Connection
我已经设法正确配置我的 java 应用程序以安全地连接到我的 mysql,但我想知道:这是配置所需证书的正确方法吗?
我已经创建了自定义信任库和自定义密钥库:
1 将服务器 CA 证书导入我的自定义信任库文件
keytool -import -alias mysqlServerCACert -file server-ca.pem -keystore truststore
2 将客户端证书和客户端密钥捆绑到一个 pkcs12 文件中,并将其导入到我的自定义密钥库文件中
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -out client.p12 -name clientalias -CAfile server-ca.pem
keytool -importkeystore -destkeystore keystore -srckeystore client.p12 -srcstoretype PKCS12 -alias clientalias
我已将我的 jdbcUrl 配置为使用安全连接:
mysql://[my_host]:3306/[my_db]?useUnicode=yes&characterEncoding=UTF-8&useSSL=true&requireSSL=true&verifyServerCertificate=true
我已使用以下 JVM 环境选项设置我的应用程序:
JAVA_OPTS="
-Djavax.net.ssl.keyStore=/path_to_my_custom_keystore
-Djavax.net.ssl.keyStorePassword=mykeyStorePassword
-Djavax.net.ssl.trustStore=/path_to_my_custom_truststore
-Djavax.net.ssl.trustStorePassword=mytrustStorePasswordPassword"
但是那样的话,我实际上已经更改了默认值 keystore/truststore,它通常位于:$JAVA_HOME/jre/lib/security/cacerts
通过这样做,一些客户端库在信任库中查找他们的 ssl 证书时开始抛出错误
所以,
我已将整个默认 ca-certs 导出到我的自定义信任库文件(显然不需要将其导入到我的密钥库,只需导入到我的信任库):
keytool -importkeystore -srckeystore /etc/ssl/certs/java/cacerts -destkeystore /path_to_my_custom_truststore
现在,一切似乎都在按预期工作,我主要担心的是我现在与原始默认 JVM 证书存储分离 (keystore/truststore) 在 /etc/ssl/certs/java/cacerts
,因此容易受到此文件未来更改的影响。
更准确地说,当更新 JVM 并添加新的证书别名时会发生什么?
最好定义自己的信任库,包括您接受的 CA 根证书,而不是使用 JVM 的默认受信任根 CA 集。
这样您就不会依赖于 JVM 的最终更新,后者可能会添加不需要的 CA 或删除所需的 CA。修改 cacerts
也会影响使用相同 JVM 的其他应用程序。
不需要将 CA 证书添加到密钥库。
我已经设法正确配置我的 java 应用程序以安全地连接到我的 mysql,但我想知道:这是配置所需证书的正确方法吗?
我已经创建了自定义信任库和自定义密钥库:
1 将服务器 CA 证书导入我的自定义信任库文件
keytool -import -alias mysqlServerCACert -file server-ca.pem -keystore truststore
2 将客户端证书和客户端密钥捆绑到一个 pkcs12 文件中,并将其导入到我的自定义密钥库文件中
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -out client.p12 -name clientalias -CAfile server-ca.pem
keytool -importkeystore -destkeystore keystore -srckeystore client.p12 -srcstoretype PKCS12 -alias clientalias
我已将我的 jdbcUrl 配置为使用安全连接:
mysql://[my_host]:3306/[my_db]?useUnicode=yes&characterEncoding=UTF-8&useSSL=true&requireSSL=true&verifyServerCertificate=true
我已使用以下 JVM 环境选项设置我的应用程序:
JAVA_OPTS="
-Djavax.net.ssl.keyStore=/path_to_my_custom_keystore
-Djavax.net.ssl.keyStorePassword=mykeyStorePassword
-Djavax.net.ssl.trustStore=/path_to_my_custom_truststore
-Djavax.net.ssl.trustStorePassword=mytrustStorePasswordPassword"
但是那样的话,我实际上已经更改了默认值 keystore/truststore,它通常位于:$JAVA_HOME/jre/lib/security/cacerts
通过这样做,一些客户端库在信任库中查找他们的 ssl 证书时开始抛出错误
所以, 我已将整个默认 ca-certs 导出到我的自定义信任库文件(显然不需要将其导入到我的密钥库,只需导入到我的信任库):
keytool -importkeystore -srckeystore /etc/ssl/certs/java/cacerts -destkeystore /path_to_my_custom_truststore
现在,一切似乎都在按预期工作,我主要担心的是我现在与原始默认 JVM 证书存储分离 (keystore/truststore) 在 /etc/ssl/certs/java/cacerts
,因此容易受到此文件未来更改的影响。
更准确地说,当更新 JVM 并添加新的证书别名时会发生什么?
最好定义自己的信任库,包括您接受的 CA 根证书,而不是使用 JVM 的默认受信任根 CA 集。
这样您就不会依赖于 JVM 的最终更新,后者可能会添加不需要的 CA 或删除所需的 CA。修改 cacerts
也会影响使用相同 JVM 的其他应用程序。
不需要将 CA 证书添加到密钥库。