为Google Cloud SQL实例开启仅SSL连接 并配置Spring应用实现SSL连接
配置Spring应用(Tomcat + C3P0)通过SSL连接Google Cloud SQL(开启仅允许SSL连接)
我来帮你一步步搞定这个配置,从Cloud SQL端的SSL设置到Spring应用的C3P0数据源配置都理清楚:
一、先完成Google Cloud SQL端的SSL配置
首先得在Cloud控制台开启强制SSL连接并获取所需证书:
- 登录Google Cloud控制台,找到你的Cloud SQL实例
- 进入「连接」->「SSL」标签页
- 勾选「仅允许SSL连接」选项,点击保存生效
- 点击「创建客户端证书」,下载三个关键证书文件:
server-ca.pem(服务器根证书)、client-cert.pem(客户端证书)、client-key.pem(客户端私钥) - 把这三个文件放到Tomcat服务器的安全目录下,比如
${CATALINA_HOME}/conf/ssl/,确保Tomcat进程有读取该目录的权限
二、修改Spring应用的DAOcontext.xml(C3P0数据源配置)
你有两种配置方式可选,直接在JDBC URL中指定证书路径,或者导入证书到Java密钥库(推荐生产环境):
方式1:直接在JDBC URL中指定证书路径
更新dataSource bean的jdbcUrl属性,添加SSL强制参数和证书路径,注意XML中特殊字符&要转义为&:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <!-- 替换为你的实例IP、数据库名和证书绝对路径 --> <property name="jdbcUrl" value="jdbc:mysql://sql_instance_ip:3306/table_name?useSSL=true&requireSSL=true&verifyServerCertificate=true&clientCertificateKeyStoreUrl=file:/opt/tomcat/conf/ssl/client-cert.pem&clientCertificateKeyStorePassword=&trustCertificateKeyStoreUrl=file:/opt/tomcat/conf/ssl/server-ca.pem"/> <!-- 别忘了配置数据库用户名和密码 --> <property name="user" value="your_db_username"/> <property name="password" value="your_db_password"/> <!-- 可选:C3P0连接池的常规配置 --> <property name="maxPoolSize" value="20"/> <property name="minPoolSize" value="5"/> <property name="checkoutTimeout" value="30000"/> </bean>
说明:
clientCertificateKeyStorePassword留空是因为PEM格式的证书没有密码,如果是加密的私钥需要填写对应密码。
方式2:将证书导入Java密钥库(推荐生产环境)
这种方式更安全,也更便于管理证书:
转换客户端证书为PKCS12格式:
用openssl把client-cert.pem和client-key.pem合并成PKCS12文件:openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -out client-keystore.p12 -name mysqlclient执行时会要求设置一个密钥库密码,比如
changeit(记牢这个密码)导入服务器根证书到信任库:
keytool -importcert -file server-ca.pem -keystore truststore.jks -alias mysqlserverca同样设置信任库密码,比如
changeit修改Tomcat的CATALINA_OPTS:
在Tomcat的bin/setenv.sh(Linux)或bin/setenv.bat(Windows)中添加以下参数,替换证书文件的绝对路径:CATALINA_OPTS="$CATALINA_OPTS -Djavax.net.ssl.keyStore=/opt/tomcat/conf/ssl/client-keystore.p12 -Djavax.net.ssl.keyStorePassword=changeit -Djavax.net.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.trustStore=/opt/tomcat/conf/ssl/truststore.jks -Djavax.net.ssl.trustStorePassword=changeit"简化JDBC URL配置:
此时DAOcontext.xml中的jdbcUrl可以简化,不用再写证书路径:<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://sql_instance_ip:3306/table_name?useSSL=true&requireSSL=true&verifyServerCertificate=true"/> <property name="user" value="your_db_username"/> <property name="password" value="your_db_password"/> <!-- C3P0连接池配置 --> <property name="maxPoolSize" value="20"/> <property name="minPoolSize" value="5"/> </bean>
三、验证配置是否生效
- 重启Tomcat服务器,让新配置生效
- 查看应用日志,确认没有
SSLHandshakeException之类的错误 - 测试非SSL连接是否被拒绝:用MySQL客户端尝试禁用SSL连接,应该会失败:
如果收到mysql -h sql_instance_ip -u your_db_username -p --ssl-mode=DISABLEDERROR 2003 (HY000): Can't connect to MySQL server on 'sql_instance_ip' (110)之类的错误,说明「仅允许SSL连接」已经生效 - 查看Cloud SQL实例的「连接」页面,确认当前连接是SSL连接
内容的提问来源于stack exchange,提问作者Hasan Çelik




