整理了一些网上的资料,这里记录一下,供大家参考
传统的应用场景中,一台服务器对应一个IP地址,一个域名,使用一张包含了域名信息的证书。随着云计算技术的普及,在云中的虚拟机有了一个IP,对应多个域名,使用多张证书的应用场景,SNI技术应运而生。SNI(Server Name Indication),即实现了一个服务器使用多个域名证书的TLS扩展,支持用户配置多个域名证书。
HTTP请求的Host字段在请求的Header中。发起HTTPS请求时,在TLS握手阶段,还无法进行HTTP数据的解析,此时TLS协议的Client Hello字段新增了一个Server Name字段,请求的客户端可以通过这个字段填充请求的Host信息,而服务端在TLS握手阶段就可以选择请求处理的证书,实现SNI的功能。
(1)主流的浏览器 可以理解为客户端工具
(2)curl和wget之类的命令行工具 可以理解为客户端工具
已知的问题:curl和jdk'版本过低(客户端不支持SNI)','导致'ssl握手的'SNI'问题
(3)库和编程语言 可以理解为客户端工具
(4)web服务器 可以理解为服务端
默认SNI是'开启的'
Nginx支持SNI,允许在同一个TLS服务端口下,配置不同的域名,用户通过请求不同的证书域名,可返回相应的upstream响应结果。
本示例配置了一个证书域名为“lwl.test.com”的单向认证代理服务,一个证书域名为“lwl.default.com”的双向认证代理服务,使用相同的443端口,具体配置如下:
# Settings for a TLS enabled server.
upstream lwl.test.com {
server 192.168.58.196;
}
upstream default {
server 192.168.58.195;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name lwl.test.com;
root /usr/share/nginx/html;
ssl_certificate /etc/nginx/ssl_sni/server/lwl.test.com/server.crt;
ssl_certificate_key /etc/nginx/ssl_sni/server/lwl.test.com/server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeo