Cloud SQL SSL/TLS配置及verify-full、verify-ca模式相关技术咨询
嘿,我来帮你拆解Cloud SQL里SSL/TLS配置的这几个疑问,结合官方文档和PostgreSQL的底层逻辑来给你讲明白:
问题(1) 如何用verify-full模式连接Cloud SQL?
要成功使用verify-full,核心是你必须用**Cloud SQL实例的完全限定域名(FQDN)**来发起连接,而不是直接用IP地址或者自定义的hostname。
首先,先确认你的实例FQDN,格式一般是:[你的实例名].[地区].cloudsql.google.com(比如my-db-us-central1.cloudsql.google.com),你可以在Cloud SQL控制台的实例详情页找到这个地址。
然后,连接时需要满足这几个条件:
- 把
sslmode明确设为verify-full - 确保客户端使用的SSL根证书是Cloud SQL提供的实例专属CA证书
- 连接的hostname严格匹配服务器证书里的Common Name(CN)——也就是上面的FQDN
举个psql命令的例子:
psql "host=my-db-us-central1.cloudsql.google.com port=5432 dbname=mydb user=myuser sslmode=verify-full sslrootcert=server-ca.pem"
如果还是失败,你可以用openssl命令检查服务器证书的CN是否和你用的FQDN一致:
openssl x509 -in server-ca.pem -text -noout | grep "Subject:"
输出里的CN=后面的内容就是证书的域名,必须和你连接时用的host完全一致。
问题(2) 如何理解“CA是实例专属时,verify-ca足够”?
先结合PostgreSQL官方文档的逻辑对比来看:
当使用公共CA(比如Let's Encrypt这类)时,
verify-ca只是验证服务器证书是由可信CA签发的,但没法防止中间人攻击——比如有人用公共CA申请了一个对应其他域名的证书,如果你用verify-ca,客户端会信任这个证书(因为是可信CA签的),但实际上你连接的是假服务器。这时候必须用verify-full,确保证书的CN和你要连接的hostname一致,才能避免这种情况。
而Cloud SQL的CA是实例专属的私有CA,不是公共CA:
- 这个CA的私钥只有Google持有,而且只用来给你的特定Cloud SQL实例签发证书
- 外部人员根本拿不到这个CA的私钥,没法伪造出能通过
verify-ca验证的假证书
所以在这种场景下,只要客户端验证了服务器证书是由这个专属CA签发的(也就是verify-ca通过),就100%能确定连接的是真实的你的Cloud SQL实例——因为没人能伪造合法的证书。这时候证书里的CN是什么其实不重要,因为能通过验证的证书必然是合法的。
简单总结:公共CA场景下,verify-ca防不住中间人;但实例专属私有CA场景下,verify-ca已经能确保连接的是真实服务器,不需要额外验证CN。
问题(3) 本地/实例专属CA下,verify-ca是否等同于verify-full?
从安全防护效果上来说,是的,在Cloud SQL这种实例专属CA的场景下,verify-ca已经提供了和verify-full完全一样的安全保障:
- 防窃听:SSL/TLS会加密所有传输的数据,第三方无法监听获取明文
- 防MITM(中间人攻击):中间人没法用你的实例专属CA签发合法的服务器证书,客户端会直接拒绝连接
唯一的技术差异是verify-full多了一层hostname与证书CN的匹配验证,但在Cloud SQL的场景下,这个验证是多余的——因为能通过verify-ca的证书,其CN必然是你的实例FQDN,而只要你用FQDN连接,verify-full也会通过,但verify-ca已经足够安全,不需要多做这一步验证。
备注:内容来源于stack exchange,提问作者x-yuri

