java - 保护 JDBC 连接时的证书和 keystore 配置

标签 java mysql jdbc certificate keystore

我已经设法正确配置我的 java 应用程序以安全地连接到我的 mysql,但我想知道:这是配置所需证书的正确方法吗?

我已经创建了一个自定义信任库和一个自定义 keystore :

1 将服务器 CA 证书导入我的自定义信任库文件

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

2 将客户端证书和客户端 key 捆绑到一个 pkcs12 文件中,并将其导入到我的自定义 keystore 文件中

 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 /信任库,它通常位于:$JAVA_HOME/jre/lib/security/cacerts

通过这样做,一些客户端库在信任库中查找他们的 ssl 证书时开始抛出错误

所以, 我已将整个默认 ca-certs 导出到我的自定义信任库文件(显然不需要将其导入我的 keystore ,只需导入我的信任库):

keytool -importkeystore -srckeystore /etc/ssl/certs/java/cacerts -destkeystore /path_to_my_custom_truststore

现在,一切似乎都按预期工作,我主要担心的是我现在与原始默认 JVM 证书存储区分离( keystore /信任库)在 /etc/ssl/certs/java/cacerts,因此容易受到此文件 future 更改的影响。

更准确地说,当 JVM 更新并添加新的证书别名时会发生什么?

最佳答案

最好定义自己的信任库,包括您接受的 CA 根证书,而不是使用 JVM 的默认受信任根 CA 集。

这样您就不会依赖于 JVM 的最终更新,它可能会添加不需要的 CA 或删除所需的 CA。修改 cacerts 也会影响使用相同 JVM 的其他应用程序。

不需要将 CA 证书添加到 keystore 。

关于java - 保护 JDBC 连接时的证书和 keystore 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41936808/

相关文章:

Java TTS(文本到语音)speech.properties 文件

java - 如何将方法作为参数传递?

mysql - 创建过程时,您的 SQL 语法有误。数据库

java.lang.ClassNotFoundException : com. mysql.jdbc.Driver for Maven runnable jar

java - 给定一个 DateTime 对象,如何获取 Joda Time 中的 DateTimeZone?

java - EntityManager 不坚持合并,当刷新时我得到一个无法初始化代理 - 没有抛出 session

mysql - MySQL 中的分组依据问题

php - SQL 查询和 PHP 检查用户是否是管理员

mysql - 存储图像(Longblob)在我的数据库中,我无法将其显示到 jlabel 中

java - 使用单个 PS 执行多个查询