Jdbi3连接谷歌云托管PostgreSQL异常及SSL禁用方案咨询
问题根因说明
你遇到的异常和Jdbi3本身、PostgreSQL连接层面的SSL配置无关,堆栈最底层的报错已经明确根因:缺少谷歌云应用默认凭据。你使用的cloud-sql-jdbc-socket-factory组件需要先完成谷歌云身份验证,才能调用Cloud SQL API获取实例连接授权,和你是否启用PostgreSQL SSL连接没有关联,所以追加sslmode=disable参数无法解决该问题。
可选解决方案
方案1:直接通过公网IP连接(无需额外依赖,可完全禁用SSL)
该方案不需要使用cloud-sql-jdbc-socket-factory组件,适合开发测试场景:
- 登录谷歌云SQL控制台,进入目标实例的「连接」配置页,开启公网访问,将你运行代码的机器的公网IP添加到实例的授权IP白名单中
- 进入实例的「SSL配置」页,关闭「仅允许SSL连接」开关
- 直接使用标准PostgreSQL JDBC URL创建连接即可,Jdbi3代码无需修改,URL示例:
jdbc:postgresql://<Cloud SQL实例公网IP>:5432/<数据库名>?sslmode=disable&user=<数据库用户名>&password=<数据库密码>
方案2:保留cloud-sql-jdbc-socket-factory组件的配置方法
如果不想配置公网IP白名单,需要先补充谷歌云身份凭据配置:
- 在谷歌云IAM控制台创建服务账号,授予该账号「Cloud SQL客户端」权限,导出服务账号的JSON密钥文件到本地
- 在运行代码的环境中配置环境变量
GOOGLE_APPLICATION_CREDENTIALS,值为上述JSON密钥文件的绝对路径 - 不需要调整JDBC URL的SSL相关参数,组件内部的SSL通信和你提到的IAM认证SSL无关,配置完凭据后即可正常连接。
方案3:保留Cloud SQL代理的使用方式
如果你的环境可以提前运行Cloud SQL代理,继续使用最开始的本地连接方式即可,不需要额外配置身份凭据和SSL参数,该方式默认已经完成谷歌云侧的身份验证。
内容的提问来源于stack exchange,提问作者Shi Tim
相关产品推荐
相关产品推荐

