根据传统HTTPS的工作原理,浏览器在访问一个HTTPS站点时,先与服务器建立SSL连接,建立连接的第一步就是请求服务器的证书。而服务器在发送证书的时候,是不知道浏览器访问的是哪个域名的,所以不能根据不同域名发送不同的证书
SNI(Server Name Indication)是为了解决一个服务器使用多个域名和证书的SSL/TLS扩展。一句话简述它的工作原理就是,在连接到服务器建立SSL连接之前先发送要访问站点的域名(Hostname),这样服务器根据这个域名返回一个合适的证书。目前,大多数操作系统和浏览器都已经很好地支持SNI扩展,OpenSSL 1.0.0已经内置这一功能,nginx1.0以上版本已经支持SNI,只需要在编译安装前安装最新的OpenSSL 1.0.0以上版本Nginx使用1.0以上版本!。在目前iPv4枯竭的时代一个IP是非常宝贵的且价格非常高,这个时候如果为了配置一个SSL证书而购买一个IP是非常不划算的。
以CentOS为例:
你可以使用以下命令查看Nginx是否开启SNI
/usr/local/nginx/sbin/nginx -V
(根据你的Nginx安装目录而定)
nginx: nginx version: nginx/1.1.0
nginx: TLS SNI support disable
如果提示:nginx: TLS SNI support enable(已开启)
如果已开启那么可直接使用和不使用SNI配置完全一样。
如果没有开启提示:如果提示:nginx: TLS SNI support disable(未开启)
那们我们需要重新编译安装Nginx
首先下载Nginx安装包
wget http://nginx.org/download/nginx-1.9.0.tar.gz
解压Nginx安装包
tar zxvf nginx-1.9.0.tar.gz
进入解压文件夹
cd nginx-1.9.0
下载OpenSSL最新版本
wget http://www.openssl.org/source/openssl-1.0.1o.tar.gz
解压OpenSSL源码包
tar zxvf openssl-1.0.1o.tar.gz
更新系统的OpenSSL组件(CentOS)
yum install -y openssl* yum install -y openssl-devel
等待完成……..
执行以下命令编译Nginx
指定编译规则:
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-ipv6 --with-openssl=./openssl-1.0.1o/
开启编译
make
等待完成(一般数分钟 视服务器而定)
备份旧文件
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
复制新文件到安装目录
cp objs/nginx /usr/local/nginx/sbin/nginx
测试Nginx配置是否正确
/usr/local/nginx/sbin/nginx -t
会得到以下提示:
the configuration file/usr/local/nginx/conf/nginx.conf syntax is ok
configuration file/usr/local/nginx/conf/nginx.conf test is successful
证明配置没有问题,如果有问题按错误提示修改!
编译更新
make upgrade
使新配置生效
/usr/local/nginx/sbin/nginx -s reload
再次使用查看Nginx开启的服务
/usr/local/nginx/sbin/nginx -V
(根据你的Nginx安装目录而定)
nginx: nginx version: nginx/1.1.0 nginx: TLS SNI support enable(已开启)
大功告成!接下来就是修改vhost的配置,加上SSL证书配置了。
via: https://qiaodahai.com/nginx-server-an-ip-address-to-configure-multiple-ssl-certificates.html