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

使用libssl与openssl连接时CN名称显示不一致问题

问题分析与解决

核心原因:SNI(Server Name Indication)配置差异

Azure CDN(*azureedge.net是其通用域名)会根据请求是否携带SNI字段返回不同证书:

  • 当请求未携带SNI时,服务器返回通用的*azureedge.net证书
  • 当请求正确携带SNI时,服务器返回对应实际主机名的证书

你遇到的差异本质是不同工具/代码是否默认启用了SNI:

  • openssl命令行默认自动发送SNI字段,所以能拿到实际主机名的CN
  • Mac上的LibreSSL命令行、你代码里的libssl连接,默认没配置SNI,因此返回通用证书

解决方法

  1. 代码中libssl添加SNI设置
    在调用SSL_connect()之前,必须手动设置SNI,示例代码:
SSL* ssl = SSL_new(ctx);
SSL_set_fd(ssl, sockfd);
// 关键:添加SNI设置
if (SSL_set_tlsext_host_name(ssl, "你的实际主机名") != 1) {
    // 处理错误逻辑
}
int ret = SSL_connect(ssl);
  1. LibreSSL命令行指定SNI
    使用LibreSSL连接时,手动加上-servername参数指定实际主机名,命令示例:
libressl s_client -connect 你的实际主机名:443 -servername 你的实际主机名

执行后就能看到对应实际主机名的CN。


验证方法

可以抓包对比两种请求的TLS握手包:

  • openssl的请求会包含Server Name Indication扩展字段
  • 未配置SNI的libssl请求则没有该字段,服务器因此返回通用证书

内容的提问来源于stack exchange,提问作者neo arun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:12:01