You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为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&amp;requireSSL=true&amp;verifyServerCertificate=true&amp;clientCertificateKeyStoreUrl=file:/opt/tomcat/conf/ssl/client-cert.pem&amp;clientCertificateKeyStorePassword=&amp;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密钥库(推荐生产环境)

这种方式更安全,也更便于管理证书:

  1. 转换客户端证书为PKCS12格式
    用openssl把client-cert.pemclient-key.pem合并成PKCS12文件:

    openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -out client-keystore.p12 -name mysqlclient
    

    执行时会要求设置一个密钥库密码,比如changeit(记牢这个密码)

  2. 导入服务器根证书到信任库

    keytool -importcert -file server-ca.pem -keystore truststore.jks -alias mysqlserverca
    

    同样设置信任库密码,比如changeit

  3. 修改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"
    
  4. 简化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&amp;requireSSL=true&amp;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>
    

三、验证配置是否生效

  1. 重启Tomcat服务器,让新配置生效
  2. 查看应用日志,确认没有SSLHandshakeException之类的错误
  3. 测试非SSL连接是否被拒绝:用MySQL客户端尝试禁用SSL连接,应该会失败:
    mysql -h sql_instance_ip -u your_db_username -p --ssl-mode=DISABLED
    
    如果收到ERROR 2003 (HY000): Can't connect to MySQL server on 'sql_instance_ip' (110)之类的错误,说明「仅允许SSL连接」已经生效
  4. 查看Cloud SQL实例的「连接」页面,确认当前连接是SSL连接

内容的提问来源于stack exchange,提问作者Hasan Çelik

火山引擎 最新活动