使用libssl与openssl连接时CN名称显示不一致问题
问题分析与解决
核心原因:SNI(Server Name Indication)配置差异
Azure CDN(*azureedge.net是其通用域名)会根据请求是否携带SNI字段返回不同证书:
- 当请求未携带SNI时,服务器返回通用的
*azureedge.net证书 - 当请求正确携带SNI时,服务器返回对应实际主机名的证书
你遇到的差异本质是不同工具/代码是否默认启用了SNI:
openssl命令行默认自动发送SNI字段,所以能拿到实际主机名的CN- Mac上的LibreSSL命令行、你代码里的libssl连接,默认没配置SNI,因此返回通用证书
解决方法
- 代码中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);
- LibreSSL命令行指定SNI
使用LibreSSL连接时,手动加上-servername参数指定实际主机名,命令示例:
libressl s_client -connect 你的实际主机名:443 -servername 你的实际主机名
执行后就能看到对应实际主机名的CN。
验证方法
可以抓包对比两种请求的TLS握手包:
- openssl的请求会包含
Server Name Indication扩展字段 - 未配置SNI的libssl请求则没有该字段,服务器因此返回通用证书
内容的提问来源于stack exchange,提问作者neo arun
相关产品推荐
相关产品推荐

