局域网安全GRPC服务器连接故障(Golang服务端Python客户端SSL报错)
核心问题原因
你生成证书时设置的通用名称(CN)为localhost,但客户端通过IP192.168.1.86访问服务端,SSL握手阶段会强制校验服务端证书对应的地址与实际访问地址是否匹配,匹配失败直接导致连接被拒绝。
证书使用正确性校验
你当前的证书文件调用逻辑没有问题:
- Go服务端加载
server.crt(公钥证书)和server.pem(转格式后的无密码私钥)初始化TLS凭证的逻辑符合gRPC规范 - Python客户端加载服务端根证书校验服务端身份的逻辑也没有问题,仅需要修正证书的地址匹配规则
修复方案
1. 调整证书生成脚本
由于你使用IP访问服务端,需要在证书的**使用者备用名称(SAN)**字段加入服务端的实际IP192.168.1.86,修改instructions.sh脚本内容如下:
#!/bin/bash SERVER_CN=localhost # 替换为服务端实际的对外访问IP SERVER_IP=192.168.1.86 # 生成CA密钥和根证书 openssl genrsa -passout pass:1111 -des3 -out ca.key 4096 openssl req -passin pass:1111 -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/CN=${SERVER_CN}" # 生成服务端私钥 openssl genrsa -passout pass:1111 -des3 -out server.key 4096 # 生成证书请求时新增SAN配置 openssl req -passin pass:1111 -new -key server.key -out server.csr -subj "/CN=${SERVER_CN}" \ -addext "subjectAltName = IP:${SERVER_IP}" # 签发服务端证书时携带SAN配置 openssl x509 -req -passin pass:1111 -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 \ -out server.crt -extfile <(printf "subjectAltName=IP:%s" "${SERVER_IP}") # 转换为PKCS8无密码格式供Go服务端使用 openssl pkcs8 -topk8 -nocrypt -passin pass:1111 -in server.key -out server.pem
2. 替换证书文件
重新执行修改后的脚本生成新证书,同步替换两端的证书文件:
- 服务端替换
ssl目录下的server.crt和server.pem - 客户端替换本地
ssl目录下的server.crt
3. 可选排查项
如果修改证书后仍连接失败,按顺序排查:
- 确认服务端50051端口的防火墙/安全组规则允许客户端IP的访问请求
- 确认客户端加载的
server.crt与服务端使用的是同一批生成的证书 - 可在客户端机器执行命令
openssl s_client -connect 192.168.1.86:50051 -CAfile ssl/server.crt测试TLS连通性,正常返回证书信息则说明TLS配置无误
内容的提问来源于stack exchange,提问作者Prince Leo
相关产品推荐
相关产品推荐

