Java 使用 SSL 进行数据库连接

Posted

技术标签:

【中文标题】Java 使用 SSL 进行数据库连接【英文标题】:Java use SSL for database connection 【发布时间】:2012-12-08 09:54:40 【问题描述】:

我目前正在不使用 SSL 连接到我的数据库。我现在想使用 SSL。我设置它的方式是我的数据库源在配置中。

DB_SOURCE=jdbc:mysql://myDatabaseInfo:3306/DB_NAME?
DB_USER=dbUser
DB_PW=dbPw

我可以通过使用以下参数调用我的程序来使 SSL 连接正常工作

-Djavax.net.ssl.trustStore=path\to\truststore
-Djavax.net.ssl.trustStorePassword=myPassword

我也可以通过更改代码本身的环境变量来让它工作

dbSource += "?useSSL=true";
System.setProperty("javax.net.ssl.trustStore", "path\to\truststore");  
System.setProperty("javax.net.ssl.trustStorePassword", "myPassword");  
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection(dbSource, dbUser, dbPw); 

但是,我的目标是在不更改我的代码和更改我使用的 VM 参数的情况下建立 SSL 连接。有没有办法可以设置我的来源以包含此信息?

类似:

jdbc:mysql://myDatabaseInfo:3306/DB_NAME?useSSL=true&trustCertificateKeyStoreUrl=path\to\truststore&trustCertificateKeyStorePassword=myPassword

我完全尝试过,但它不起作用,理想情况下我可以将信息添加到我已经拥有的配置中,这样我就不必在多个地方进行更改。有什么想法吗?

【问题讨论】:

【参考方案1】:

建议一:把你的信任库代替java的信任库,或者把你的证书导入java的信任库:$java.home/lib/security/cacerts

建议 2: 编写自己的驱动程序扩展 com.mysql.jdbc.Driver。将 SSL 配置放入新代码中。虽然您需要编码,但不在主应用程序中。不确定您是否可以接受。

【讨论】:

关于#1,它只包含信任库的位置,我仍然需要VM参数来设置密码,不是吗? 如果将证书导入java的默认信任库,则无需设置密码。这是'改变':)【参考方案2】:

根据MySQLConnector documentation 的安全部分,trustCertificateKeyStoreUrl 将 URL 作为输入。

也就是说,您必须在其前面加上 file: 才能使其适用于本地文件。换句话说,您需要将信任库的路径设置为file:path\to\truststore

如果您也使用该参数,clientCertificateKeyStoreUrl 也是如此。

【讨论】:

以上是关于Java 使用 SSL 进行数据库连接的主要内容,如果未能解决你的问题,请参考以下文章

java连接本地数据库 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。

如何使用 Postgres 数据库 url 字符串传递证书路径以进行 SSL 连接

java连接数据库报了ssl连接的警告

如何通过java程序来加载客户端证书进行ssl连接?

具有指定证书的 Java MySQL SSL 连接

SSL连接分为两个阶段:握手和数据传输阶段