Last Updated on 2024-04-02 by likun.gong
SNI是什么
SNI: Server Name Indication 服务名称标识。顾名思义,是用来标识服务名的
服务名:一般表示的是网站域名
在现如今的 Web 服务器,一般同个 IP + 端口 会包含多个网站,在 https 协议中,每个域名可能都会有自己的证书,如果只有 IP 地址,在访问 https 的时候,服务端不足以判断访问哪个域名,从而可能导致 SSL证书错误。
SNI 就是用来标识访问的域名是哪个,起到一个引路的作用。
SNI 主要用在 https 中,在 http 中是没有 SNI 的,因为 http 没有 tls 握手的过程,直接通过请求头中的 Host 字段判断访问的哪个域名。
SNI的体现
SNI 主要在 TLS 握手的 client hello 的扩展信息中,以此发给服务端
在 Nginx 中配置多 https 的例子:
http {
# ...
server {
listen 443 ssl;
server_name example1.com;
# 使用 SNI 为 example1.com 配置 SSL 证书
ssl_certificate /path/to/your/certificate1.pem;
ssl_certificate_key /path/to/your/key1.pem;
# ...
}
server {
listen 443 ssl;
server_name example2.com;
# 使用 SNI 为 example2.com 配置 SSL 证书
ssl_certificate /path/to/your/certificate2.pem;
ssl_certificate_key /path/to/your/key2.pem;
# ...
}
}
ESNI
Client Hello 数据包是明文传输的,请求的域名信息会泄漏。
ESNI (Encrypted Server Name Indication) 是 SNI 的加密版,将 SNI 的信息加密,防止中间人窥探客户端正在请求的证书,进一步保护客户端。
发表回复