gRPC配置SSL后连接报错:未找到匹配IP的使用者可选名称问题求助
问题根因
你生成证书时的*主体备用名称(SAN)*类型配置错误:IP地址需要使用IP.前缀定义,你错误使用了仅适用于域名的DNS.前缀,导致Java SSL栈无法识别到证书中匹配的IP条目。
解决方案
方案1:重新生成正确配置的证书(推荐,生产环境可用)
使用以下命令重新生成证书,将IP地址的SAN类型修正为IP.1:
openssl req -x509 -newkey rsa:4096 -keyout ./grpc-server/src/main/resources/my-private-key.pem -out ./grpc-server/src/main/resources/my-public-key-cert.pem -days 365 -nodes -subj "/CN=192.168.88.132" -addext "subjectAltName = IP.1:192.168.88.132, DNS.1:localhost"
生成完成后可以用以下命令验证证书SAN配置是否正确:
openssl x509 -in ./grpc-server/src/main/resources/my-public-key-cert.pem -text -noout | grep -A 1 "Subject Alternative Name"
正确输出会包含如下内容:
X509v3 Subject Alternative Name: IP Address:192.168.88.132, DNS:localhost
将新生成的证书替换服务端和客户端的旧证书,重启服务即可正常连接。
方案2:临时跳过主机名校验(仅测试环境使用,生产环境禁止)
如果只是本地临时测试不想重新生成证书,可以在客户端构建Channel时添加跳过主机名校验的配置,修改客户端代码如下:
ManagedChannel channel = NettyChannelBuilder.forTarget("192.168.88.132:5555") .sslContext(context) .skipHostVerification() // 新增该行,跳过主机名校验 .build();
注意:该配置会跳过SSL证书的主机名匹配校验,存在中间人攻击风险,绝对不允许在生产环境使用。
内容的提问来源于stack exchange,提问作者Нуркасым Абилов
相关产品推荐
相关产品推荐

