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

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

1
2
3
4
5
$ 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,下载并解压到某个目录

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

重新编译 Nginx

1
2
3
4
5
6
7
8
9
10
$ 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

1
2
3
4
5
$ 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 文件哪里写错了,后来误打误撞发现原来是跟没有开启某些相关,希望能帮助大家少走不必要的路。