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

如何禁用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 15:42:04