You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 23:47:42