Nginx如何支持SNI?

Nginx可以通过ngx_http_ssl_module模块支持SNI(Server Name Indication)。SNI是TLS的一个扩展,允许客户端在连接握手阶段指定目标服务器名称。
SNI的主要作用是:允许一台服务器上托管多个TLS网站,根据客户端请求的服务器名称返回不同的证书。

要在Nginx中配置SNI,需要:

  1. 编译Nginx时添加–with-http_ssl_module参数启用ngx_http_ssl_module模块。
  2. 在server段使用listen指令绑定默认证书与端口。
server {
    listen       443 ssl; 
    ssl_certificate      /etc/nginx/ssl/default.crt;
    ssl_certificate_key  /etc/nginx/ssl/default.key;
} 
  1. 使用server_name指令匹配需要SNI的服务器名,并指定证书。
server {
    listen       443 ssl; 
    server_name  www.example1.com;
    ssl_certificate      /etc/nginx/ssl/example1.crt; 
    ssl_certificate_key  /etc/nginx/ssl/example1.key;
}

server {
    listen       443 ssl;     
    server_name  www.example2.com;
    ssl_certificate      /etc/nginx/ssl/example2.crt;  
    ssl_certificate_key  /etc/nginx/ssl/example2.key;
}
  1. 如果客户端请求未匹配任何server_name,将使用默认证书进行握手。

这种方式允许我们在一台Nginx上托管多个SSL网站,并根据SNI选择不同的证书,无需为每个网站部署一台Nginx。SNI提高了服务器资源利用率,降低了运维成本,是实现大规模HTTPS部署的基石技术。