β

通过开启 Nginx TLS SNI 来支持同一 IP 下多 SSL 证书

Belin Chung 225 阅读

前几天说给博客部署 SSL 证书来提高逼格,后来因为自己一个项目的需要,也跟着申请了多了一张 SSL 证书,按照相同的流程部署上去后,发现前面的域名的证书都 load 到了新增加的那张证书。接着 Google 了下,原来是 Nginx 编译的时候没有开启 TLS SNI ,这样就导致了同一 IP 下只能支持一张证书。

查看已安装的 Nginx 是否开启 TLS SNI

$ nginx -V
ginx version: nginx/1.6.2
built by gcc 4.1.2 20080704 (Red Hat 4.1.2-55)
TLS SNI support disabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module

TLS SNI support disabled 即未开启

下载支持 SNI 的 OpenSSL

重新编译 Nginx 需要 OpenSSL,下载并解压到某个目录

$ cd ~
$ wget http://www.openssl.org/source/openssl-1.0.2a.tar.gz
$ tar zxvf openssl-1.0.2a.tar.gz

重新编译 Nginx

$ cd nginx-1.6.2 #这里假设你已经下载比解压了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-openssl=path/to/openssl-1.0.2a
$ make
$ mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old #备份旧的nginx
$ cp objs/nginx /usr/local/nginx/sbin/nginx #替换编译好的nginx

make 的编译选项加上 --with-openssl=path/to/openssl-1.0.2a 参数指向的是你解压的 OpenSSL 目录,make 编译完成后不要执行 make install ,直接将 objs 目录下编译好的新 nginx 执行文件 copy 到原来的路径下替换即可。

确认已经开启 TLS SNI

$ nginx -V
ginx version: nginx/1.6.2
built by gcc 4.1.2 20080704 (Red Hat 4.1.2-55)
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_modul --with-openssl=../../openssl-1.0.2a

虽然是很简单的一件事,其实我折腾了好久,我一直以为是我 conf 文件哪里写错了,后来误打误撞发现原来是跟没有开启某些相关,希望能帮助大家少走不必要的路。

作者:Belin Chung