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

Spring Boot通过SSL连接PostgreSQL及Cloud SQL Postgres的问题排查

Spring Boot SSL连接PostgreSQL及Cloud SQL Postgres指南(附超时问题排查)

问题1:如何使用Spring Boot通过SSL连接PostgreSQL?

步骤1:确认PostgreSQL服务器的SSL配置

首先要确保服务器端已经开启并配置好SSL:

  • 修改postgresql.conf,设置ssl = on,并重启PostgreSQL服务
  • 修改pg_hba.conf,添加允许SSL连接的规则,例如:
    hostssl  all  all  <你的客户端IP>/32  scram-sha-256
    
    (如果需要强制客户端提供证书,可以添加sslcert=require参数)
  • 确保服务器的5432端口在防火墙/安全组中对客户端IP开放

步骤2:Spring Boot正确配置

你的证书放在src/main/resources/certs/postgres下,打包后这些文件会在classpath中,所以配置时要使用classpath:前缀来确保路径正确,同时注意URL参数不要有空格(你的原配置里有空格,这可能是问题之一):

# application.properties
spring.datasource.url=jdbc:postgresql://<服务器IP>:5432/<数据库名>?ssl=true&sslmode=verify-ca&sslcert=classpath:certs/postgres/client-cert.pem&sslkey=classpath:certs/postgres/client-key.pem&sslrootcert=classpath:certs/postgres/server-ca.pem
spring.datasource.username=<数据库用户名>
spring.datasource.password=<数据库密码>
spring.datasource.driver-class-name=org.postgresql.Driver

注意:如果你的client-key.pem是加密的,需要在URL中添加sslpassword=<密钥密码>参数


问题2:如何使用Spring Boot通过SSL连接Cloud SQL Postgres?

Cloud SQL提供两种SSL连接方式,直接SSL连接和更推荐的Cloud SQL Auth Proxy方式:

方式1:直接SSL连接

  1. 下载证书:进入Cloud SQL实例控制台 → 「连接」→「SSL」→ 创建客户端证书,下载server-ca.pemclient-cert.pemclient-key.pem,放到src/main/resources/certs/postgres目录
  2. 配置Spring Boot
    spring.datasource.url=jdbc:postgresql://<Cloud SQL公网IP>:5432/<数据库名>?ssl=true&sslmode=verify-ca&sslcert=classpath:certs/postgres/client-cert.pem&sslkey=classpath:certs/postgres/client-key.pem&sslrootcert=classpath:certs/postgres/server-ca.pem
    spring.datasource.username=<Cloud SQL用户名>
    spring.datasource.password=<Cloud SQL密码>
    
  3. 授权客户端IP:在Cloud SQL控制台的「连接」→「授权网络」中添加你的客户端公网IP,允许访问5432端口

方式2:使用Cloud SQL Auth Proxy(更安全,无需管理证书)

这种方式不需要手动配置SSL,Proxy会自动处理加密连接:

  1. 下载并运行Auth Proxy
    # 下载适合你系统的Proxy,然后运行
    ./cloud-sql-proxy <GCP项目ID>:<区域>:<实例名称>
    
  2. Spring Boot配置:直接连接本地的Proxy端口,无需SSL参数:
    spring.datasource.url=jdbc:postgresql://localhost:5432/<数据库名>
    spring.datasource.username=<Cloud SQL用户名>
    spring.datasource.password=<Cloud SQL密码>
    
  3. 生产环境集成:可以使用Spring Cloud GCP自动管理Proxy,添加依赖:
    <!-- pom.xml -->
    <dependency>
        <groupId>com.google.cloud</groupId>
        <artifactId>spring-cloud-gcp-starter-sql-postgresql</artifactId>
    </dependency>
    
    然后配置:
    spring.cloud.gcp.sql.instance-connection-name=<GCP项目ID>:<区域>:<实例名称>
    spring.cloud.gcp.sql.database-name=<数据库名>
    spring.datasource.username=<用户名>
    spring.datasource.password=<密码>
    

你的连接超时问题排查

从堆栈跟踪看,你遇到的是java.net.SocketTimeoutException: connect timed out,这说明客户端无法建立到服务器的TCP连接,优先排查以下几点:

  • 检查网络可达性:用telnet <服务器IP> 5432nc -zv <服务器IP> 5432测试是否能连接到5432端口
  • 确认IP和端口正确性:确保URL中的服务器IP、端口(默认5432)没有写错
  • 防火墙/安全组配置
    • 普通PostgreSQL:确认服务器防火墙允许你的客户端IP访问5432端口
    • Cloud SQL:确认你已经将客户端IP添加到「授权网络」中
  • URL参数格式:你的原URL中参数有多余空格(比如 ssl=true& sslmode),这会导致参数解析错误,必须去掉空格,写成ssl=true&sslmode=verify-ca

内容的提问来源于stack exchange,提问作者Clement

火山引擎 最新活动