Nginx单IP地址配置多个SSL证书的方法
默认情况下,Nginx一个IP地址仅支持一个SSL证书,需要多个IP地址才能配置多个SSL证书,在公网IP地址有限的情况下,可以使用TLS Server Name Indication extension(SNI, RFC 6066),它允许浏览器在SSL握手的时候发送请求的server name,也就是 Host,这样 Nginx 就能找到对应server 的SSL配置。
配置步骤如下:
1、检查Nginx是否支持TLS
$ nginx -V
...
TLS SNI support enabled
...
2、如果出现TLS SNI support disable,就得升级openssl版本,并且重新编译nginx。
具体步骤如下:
首先下载openssl(建议下载1.0.1h版本)
#wget http://www.openssl.org/source/openssl-1.0.1h.tar.gz
下载Nginx
#wget http://nginx.org/download/nginx-1.9.9.tar.gz
解压openssl
#tar -zxvf openssl-1.0.1h.tar.gz
解压nginx,并编译
#tar -zxvf nginx-1.9.9.tar.gz
#cd nginx-1.9.9
#./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.1h/
#make && make install
#检查Nginx版本信息
#/usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.9.9
built by gcc 4.1.2 20080704 (Red Hat 4.1.2-55)
built with OpenSSL 1.0.1h 5 Jun 2014
TLS SNI support enabled
configure arguments: --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.1h/
配置Vhost中的域名证书
server
{
#########
listen 80;
listen 443 ssl;
#listen [::]:80;
server_name we.baohua.me;
root /home/wwwroot/we.baohua.me;
ssl on;
ssl_certificate_key /home/wwwroot/cert/we.baohua.me.key;
ssl_certificate /home/wwwroot/cert/we.baohua.me.crt;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
###############
}
然后,重启Nginx即可。
例子2 给Nginx配置一个自签名的SSL证书
下面简单介绍如何创建一个自签名的SSL证书。创建自签名证书需要安装openssl,使用以下步骤:1.创建Key;2.创建签名请求;3.将Key的口令移除;4.用Key签名证书。为HTTPS准备的证书需要注意,创建的签名请求的CN必须与域名完全一致,否则无法通过浏览器验证。以上步骤命令繁琐,所以我做了一个shell脚本,能一次性把证书搞定。从这里下载脚本:https://github.com/michaelliao/itranswarp.js/blob/master/conf/ssl/gencert.sh运行脚本,假设你的域名是www.test.com,那么按照提示输入:$ ./gencert.sh
Enter your domain [www.example.com]: www.test.com
Create server key...
Generating RSA private key, 1024 bit long modulus
.................++++++
.....++++++
e is 65537 (0x10001)
Enter pass phrase for www.test.com.key:输入口令
Verifying - Enter pass phrase for www.test.com.key:输入口令
Create server certificate signing request...
Enter pass phrase for www.test.com.key:输入口令
Remove password...
Enter pass phrase for www.test.com.origin.key:输入口令
writing RSA key
Sign SSL certificate...
Signature ok
subject=/C=US/ST=Mars/L=iTranswarp/O=iTranswarp/OU=iTranswarp/CN=www.test.com
Getting Private key
TODO:
Copy www.test.com.crt to /etc/nginx/ssl/www.test.com.crt
Copy www.test.com.key to /etc/nginx/ssl/www.test.com.key
Add configuration in nginx:
server {
...
ssl on;
ssl_certificate /etc/nginx/ssl/www.test.com.crt;
ssl_certificate_key /etc/nginx/ssl/www.test.com.key;
}
红色部分是输入,注意4次输入的口令都是一样的。在当前目录下会创建出4个文件:•www.test.com.crt:自签名的证书
•www.test.com.csr:证书的请求
•www.test.com.key:不带口令的Key
•www.test.com.origin.key:带口令的Key
Web服务器需要把www.test.com.crt发给浏览器验证,然后用www.test.com.key解密浏览器发送的数据,剩下两个文件不需要上传到Web服务器上。以Nginx为例,需要在server {...}中配置:server {
...
ssl on;
ssl_certificate /etc/nginx/ssl/www.test.com.crt;
ssl_certificate_key /etc/nginx/ssl/www.test.com.key;
}
如果一切顺利,打开浏览器,就可以通过HTTPS访问网站。第一次访问时会出现警告(因为我们的自签名证书不被浏览器信任),把证书通过浏览器导入到系统(Windows使用IE导入,Mac使用Safari导入)并设置为“受信任”,以后该电脑访问网站就可以安全地连接Web服务器了
如何在应用服务器中配置证书呢?例如Tomcat,gunicorn等。正确的做法是不配置,让Nginx处理HTTPS,然后通过proxy以HTTP连接后端的应用服务器,相当于利用Nginx作为HTTPS到HTTP的安全代理,这样即利用了Nginx的HTTP/HTTPS处理能力,又避免了应用服务器不擅长HTTPS的缺点。