如何禁用gRPC客户端侧服务端证书主机名验证
迁移实现代码
#include <grpcpp/security/tls_credentials_options.h> // ... 原有其他业务逻辑保持不变 std::shared_ptr<grpc::ChannelCredentials> channel_creds; // 原有三个PEM内容的赋值逻辑完全复用,不需要修改 const std::string& pem_root_certs = /* 存储根CA证书公钥的PEM内容 */; const std::string& pem_cert_chain = /* 存储客户端证书公钥的PEM内容 */; const std::string& pem_private_key = /* 存储客户端证书私钥的PEM内容 */; // 1. 构建静态证书提供者,直接传入原有三个PEM内容 auto cert_provider = std::make_shared<grpc::experimental::StaticDataCertificateProvider>( pem_root_certs, std::vector<grpc::experimental::IdentityKeyCertPair>{{pem_private_key, pem_cert_chain}} ); // 2. 配置TLS通道凭证选项 grpc::experimental::TlsChannelCredentialsOptions tls_opts; tls_opts.set_certificate_provider(cert_provider); // 跳过主机名校验,仅验证证书信任链合法性 tls_opts.set_server_verification_option(GRPC_TLS_SKIP_HOSTNAME_VERIFICATION); // 加载根证书和客户端身份凭证配置 tls_opts.watch_root_certs(); tls_opts.watch_identity_key_cert_pairs(); // 3. 生成TLS凭证并创建通道 channel_creds = grpc::experimental::TlsCredentials(tls_opts); // 原有SetSslTargetNameOverride逻辑可以直接删除,不需要再做主机名覆盖 // 通道创建逻辑不变 grpc::CreateCustomChannel(addr_str, channel_creds, grpc::ChannelArguments());
关键逻辑说明
- 原有
SslCredentialsOptions里的三个PEM字段不需要做任何格式转换,直接传入证书提供者即可:- 第一个参数对应原
pem_root_certs,用于校验服务端证书信任链 - 第二个参数是客户端身份密钥对列表,单个
IdentityKeyCertPair的第一个字段对应原pem_private_key,第二个字段对应原pem_cert_chain
- 第一个参数对应原
- 配置
GRPC_TLS_SKIP_HOSTNAME_VERIFICATION后,gRPC只会校验服务端证书是否可以通过你提供的根证书完成信任链校验,不会再校验证书的SAN/CN和访问的服务端地址是否匹配,完全符合需求 - 如果不需要双向认证,只需要把第二个参数的密钥对列表改为空列表即可
内容的提问来源于stack exchange,提问作者pipsqueaker117
相关产品推荐
相关产品推荐

