配置spring以通过ssl连接到mysql

时间:2013-01-10 18:47:42

标签: spring ssl jdbc c3p0 spring-jdbc

我从Java应用程序通过SSL连接到MySQL。我已将MYSQL配置为支持SSL并生成客户端证书。我已将服务器CA证书和客户端证书导入密钥库。这就是我的代码目前的样子

    String url = "jdbc:mysql://127.0.0.1:3306/MySampleDb? verifyServerCertificate =true&useSSL=true&requireSSL=true"

    System.setProperty("javax.net.ssl.keyStore","/home/cert/keystore");
    System.setProperty("javax.net.ssl.keyStorePassword","password");
    System.setProperty("javax.net.ssl.trustStore","/home/cert/truststore");
    System.setProperty("javax.net.ssl.trustStorePassword","password");

    Class.forName("com.mysql.jdbc.Driver");
    con = DriverManager.getConnection(url, user, password);

我想使用带有C3p0的spring通过SSL连接到MYSQL。这是我的spring配置文件,它从jdbc.properties中读取参数。

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="${jdbc.driver}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="user" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    ........
</bean>

如何配置弹簧来设置属性 verifyServerCertificate = true
useSSL =真
requireSSL =真“

也可以在spring配置文件中设置 keyStore和trustStore 值。

3 个答案:

答案 0 :(得分:8)

jdbc.properties中jdbc.url的值必须为

  

JDBC:MySQL的://127.0.0.1:3306 / MySampleDb verifyServerCertificate =真安培; useSSL =真安培; requireSSL =真

这些参数必须直接添加到MySQL的URL中。 keyStoretrustStore的参数应该在开始时传递给JVM,如下所示:

-Djavax.net.ssl.keyStore=path_to_keystore_file
-Djavax.net.ssl.keyStorePassword=password
-Djavax.net.ssl.trustStore=path_to_truststore_file
-Djavax.net.ssl.trustStorePassword=password

可以 use Spring to set system properties但我永远不会使用它,这太麻烦了。

答案 1 :(得分:1)

不必通过keyStoretrustStorejava程序或设置任何系统属性,因为可以通过每个连接的连接属性来实现!

因此,您可以将不同的证书用于不同的连接(如果在应用程序服务器中,则可以使用应用程序)。

原始答案:https://stackoverflow.com/a/51879119/173149相关部分:

  

jdbc:mysql://example.com:3306 / MYDB?verifyServerCertificate = true&useSSL = true&requireSSL = true&clientCertificateKeyStoreUrl = file:cert / keystore.jks&clientCertificateKeyStorePassword = 123456&trustCertificateKeyStoreUrl = file:cert / truststore.12 +

记录在案:

答案 2 :(得分:0)

您可以使用基于Java的配置来配置DataSource useSSl requireSSL verifyServerCertificate 属性。 addDataSourceProperty类的DataSource方法为您提供了此功能,如下面的代码片段所示(您可以使用C3p0实例替换HikariDataSource)

MySQL Connector / J公开了密钥存储区的配置属性(例如trustCertificateKeyStoreUrl),因此我假设addDataSourceProperty也可以用于这些属性。

我不知道XML配置模式是否提供了与addDataSourceProperty相对应的标签。

public DataSource createPslDataSource(final MyDataSourceProperties myDataSourceProperties) {

    HikariDataSource dataSource = new HikariDataSource();

    dataSource.addDataSourceProperty("useSSL", true);
    dataSource.addDataSourceProperty("requireSSL", true);
    dataSource.addDataSourceProperty("verifyServerCertificate", true);

    dataSource.setJdbcUrl(myDataSourceProperties.getJdbcUrl());
    dataSource.setUsername(myDataSourceProperties.getUsername());
    dataSource.setPassword(myDataSourceProperties.getPassword());

    return dataSource;
}