Nginx可以通过ngx_http_ssl_module模块支持SNI(Server Name Indication)。SNI是TLS的一个扩展,允许客户端在连接握手阶段指定目标服务器名称。
SNI的主要作用是:允许一台服务器上托管多个TLS网站,根据客户端请求的服务器名称返回不同的证书。
要在Nginx中配置SNI,需要:
- 编译Nginx时添加–with-http_ssl_module参数启用ngx_http_ssl_module模块。
- 在server段使用listen指令绑定默认证书与端口。
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/default.crt;
ssl_certificate_key /etc/nginx/ssl/default.key;
}
- 使用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;
}
- 如果客户端请求未匹配任何server_name,将使用默认证书进行握手。
这种方式允许我们在一台Nginx上托管多个SSL网站,并根据SNI选择不同的证书,无需为每个网站部署一台Nginx。SNI提高了服务器资源利用率,降低了运维成本,是实现大规模HTTPS部署的基石技术。