使用JDBC开启SSL连接Google CloudSQL出现访问被拒绝问题求助
问题排查与缺失配置说明
1. 缺失客户端证书keystore配置
Cloud MySQL的SSL连接默认启用双向认证,除了验证服务端证书的truststore之外,你还需要将获取到的client-key.pem和client-cert.pem打包生成keystore文件,并在代码中配置对应的系统属性:
- 生成keystore的步骤:
- 先将pem格式的客户端证书和密钥转换为pkcs12格式,命令行执行:
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -name "mysqlclient" -passout pass:<自定义keystore密码> -out client-keystore.p12 - 再将pkcs12转换为jks格式keystore,命令行执行:
keytool -importkeystore -srckeystore client-keystore.p12 -srcstoretype pkcs12 -srcstorepass <刚才设置的密码> -destkeystore keystore.jks -deststoretype jks -deststorepass <自定义jks密码> - 代码中补充keystore相关配置:
System.setProperty("javax.net.ssl.keyStore", "D://keystore.jks"); System.setProperty("javax.net.ssl.keyStorePassword", "<你设置的jks密码>");
- 先将pem格式的客户端证书和密钥转换为pkcs12格式,命令行执行:
2. 连接地址与网络权限检查
- 如果你代码中填的连接地址是
localhost:3306,需要确认你本地已经启动了Cloud SQL Auth代理,并且代理已经正确绑定到目标Cloud MySQL实例。 - 如果没有使用Auth代理,需要将连接地址替换为Cloud MySQL实例的公网/私网访问地址,同时确认你本地客户端的公网IP已经添加到Cloud MySQL实例的授权网络列表中。
3. 账号权限与连接参数校验
- 确认你使用的数据库账号已经被授权允许从你当前访问的IP地址登录,Cloud MySQL的账号可以限制允许登录的客户端地址,默认如果创建时选择的是
%(任意地址)则不需要额外调整。 - 如果你使用的是8.x版本的MySQL JDBC驱动,需要将驱动类改为
com.mysql.cj.jdbc.Driver,避免类加载异常。 - 可以在JDBC连接参数中补充证书相关参数直接在连接串中配置,避免全局系统属性影响其他连接,连接串示例:
jdbc:mysql://<你的CloudSQL实例地址>:3306/dbname?verifyServerCertificate=true&useSSL=true&requireSSL=true&clientCertificateKeyStoreUrl=file:D:/keystore.jks&clientCertificateKeyStorePassword=<keystore密码>&trustCertificateKeyStoreUrl=file:D:/truststore.jks&trustCertificateKeyStorePassword=<truststore密码>
内容的提问来源于stack exchange,提问作者user846445
相关产品推荐
相关产品推荐

