如何让自签名证书同时支持本地及Google Cloud Run的gRPC通信
问题根源
当前生成的服务器证书仅将localhost设为唯一有效域名,部署到Google Cloud Run后,服务实际域名是xxx.run.app格式,TLS握手时域名不匹配导致gRPC连接失败。要同时支持本地和生产环境,需要给服务器证书添加多域名扩展(SAN,Subject Alternative Names),覆盖本地环境和Cloud Run的域名。
调整后的证书生成方案
1. 创建SAN扩展配置文件
新建openssl-san.cnf文件,定义需要支持的域名和IP:
[req] default_bits = 4096 prompt = no default_md = sha256 distinguished_name = dn req_extensions = req_ext [dn] C=CL ST=RM L=Santiago O=Test OU=Server CN=localhost [req_ext] subjectAltName = @alt_names [alt_names] DNS.1 = localhost DNS.2 = *.run.app # 可替换为你的具体Cloud Run服务域名(如my-service-123.run.app),安全性更高 IP.1 = 127.0.0.1 # 支持本地IP访问
2. 修改证书生成脚本
更新generator.sh,在生成服务器CSR和签名证书时引用上述配置:
# Clean Up rm *.crt *.csr *.key *.cnf echo "Generating certificates ..." # 生成CA证书 openssl genrsa -passout pass:1111 -des3 -out ca.key 4096 openssl req -passin pass:1111 -new -x509 -days 365 -key ca.key -out ca.crt -subj "/C=CL/ST=RM/L=Santiago/O=Test/OU=Test/CN=ca" # 生成带SAN扩展的服务器证书 openssl genrsa -passout pass:1111 -des3 -out server.key 4096 openssl req -passin pass:1111 -new -key server.key -out server.csr -config openssl-san.cnf openssl x509 -req -passin pass:1111 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt -extensions req_ext -extfile openssl-san.cnf openssl rsa -passin pass:1111 -in server.key -out server.key # 生成客户端证书(保持原有逻辑,若需客户端多环境支持可参照服务器配置添加SAN) openssl genrsa -passout pass:1111 -des3 -out client.key 4096 openssl req -passin pass:1111 -new -key client.key -out client.csr -subj "/C=CL/ST=RM/L=Santiago/O=Test/OU=Client/CN=localhost" openssl x509 -req -passin pass:1111 -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt openssl rsa -passin pass:1111 -in client.key -out client.key
关键注意事项
- SAN扩展有效性:
subjectAltName是TLS验证的核心依据,必须包含所有需要访问服务的域名/IP,gRPC会严格校验这一字段。 - Cloud Run域名优化:若你的服务有固定域名(如
my-service-abc123.run.app),建议替换*.run.app为该具体域名,避免通配符带来的安全风险。 - 证书部署:Cloud Run服务需加载新生成的
server.crt和server.key;所有客户端(本地和生产)都需加载ca.crt以信任自签名证书,避免TLS验证错误。 - 客户端证书:若服务端需要验证客户端身份,可参照服务器配置给客户端证书添加SAN,否则保持原有配置即可。
内容的提问来源于stack exchange,提问作者ololo
相关产品推荐
相关产品推荐

