gRPC客户端与服务端TLS通信失败问题求助
gRPC TLS通信失败:No name matching localhost found 问题解决
问题根源
客户端TLS握手时验证服务端证书主机名不匹配,原因是服务端证书的**通用名称(CN)或主题备用名称(SAN)**字段未包含localhost,导致SSL握手验证失败。
解决方案
重新生成包含localhost标识的服务端证书,步骤如下:
1. 创建证书扩展配置文件(推荐)
新建server-ext.cnf文件,内容如下:
[req] req_extensions = v3_req distinguished_name = req_distinguished_name [req_distinguished_name] [v3_req] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = localhost IP.1 = 127.0.0.1
该配置明确指定证书的备用名称包含localhost和本地回环IP。
2. 重新生成服务端证书相关文件
先清理旧的服务端证书文件(可选):
rm ca.key ca.csr ca.crt ca.pem
然后执行以下命令生成新文件:
# 生成服务端私钥 openssl genrsa -out ca.key 2048 # 生成带SAN字段的证书签名请求(CSR) openssl req -new -key ca.key -out ca.csr -config server-ext.cnf # 用CA根证书签名服务端CSR,生成带SAN的服务端证书 openssl x509 -req -in ca.csr -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -out ca.crt -days 365 -extensions v3_req -extfile server-ext.cnf # 转换私钥为gRPC要求的PKCS8格式 openssl pkcs8 -topk8 -nocrypt -in ca.key -out ca.pem
3. 更新证书并重启服务
将新生成的ca.crt和ca.pem替换服务端certs目录下的旧文件,保持客户端的ca.cert.pem(CA根证书)不变,最后重启gRPC服务端和客户端。
证书验证(可选)
执行以下命令检查服务端证书是否包含localhost:
openssl x509 -in ca.crt -text -noout | grep -A 3 "Subject Alternative Name"
若输出包含DNS:localhost和IP Address:127.0.0.1,则证书配置正确。
内容的提问来源于stack exchange,提问作者Sanjay Naik
相关产品推荐
相关产品推荐

