如何从App Engine应用内连接启用强制SSL的Google Cloud SQL实例
解决方案
直接处理证书权限问题
- 利用App Engine运行时的可写临时目录
/tmp解决权限问题:- 将Cloud SQL提供的CA证书、客户端证书、客户端私钥内容硬编码到应用配置中,或随部署包一同打包(不要放到静态资源目录)
- 应用初始化时,将三个证书内容分别写入
/tmp目录下的独立文件,写入完成后调用os.chmod(文件路径, 0o600)修改权限,App Engine的临时目录支持权限修改操作 psycopg2连接时直接传入/tmp下的证书路径即可通过权限校验
- 无文件极简方案:若使用
psycopg2>=2.7版本,可直接将证书内容作为字符串传入连接参数,无需落地到文件系统,自然避开权限校验:
import psycopg2 conn = psycopg2.connect( dbname="你的数据库名", user="数据库用户名", password="数据库密码", host="Cloud SQL实例公网IP", port="5432", sslmode="verify-ca", sslrootcert="-----BEGIN CERTIFICATE-----\n你的CA证书内容\n-----END CERTIFICATE-----", sslcert="-----BEGIN CERTIFICATE-----\n你的客户端证书内容\n-----END CERTIFICATE-----", sslkey="-----BEGIN PRIVATE KEY-----\n你的客户端私钥内容\n-----END PRIVATE KEY-----" )
更优的目标实现方案(推荐)
你的核心需求是强制GCP外部(工作站)访问数据库走SSL,App Engine到Cloud SQL的通信可以通过GCP原生安全通道避开证书配置问题,完全消除当前的副作用:
- 优先用内置Unix套接字连接:
- 在Cloud SQL控制台开启「仅允许SSL连接」,满足外部访问强制SSL的要求
- 在App Engine的
app.yaml配置文件中添加beta_settings.cloud_sql_instances = "你的GCP项目ID:实例区域:Cloud SQL实例ID",GCP会自动为App Engine实例挂载Cloud SQL的Unix套接字 psycopg2连接时将host参数设置为/cloudsql/你的GCP项目ID:实例区域:Cloud SQL实例ID,无需配置任何SSL相关参数,该通信路径为GCP内部私有链路,天然加密,不需要走公网也不需要证书校验
- 无公网方案:
- 关闭Cloud SQL的公网访问,配置为仅允许VPC内部访问
- 为App Engine配置无服务器VPC访问连接器,让App Engine的请求走私有网络访问Cloud SQL
- 外部工作站访问时使用Cloud SQL Auth Proxy,代理会自动处理SSL加密,无需手动管理证书即可满足强制SSL的要求
内容的提问来源于stack exchange,提问作者dreo
相关产品推荐
相关产品推荐

