一、准备证书
通常情况下网站的SSL证书是由专门的CA机构(如VeriSign)颁发,同时需要交纳一定数额的费用。可是对于平时开发测试或其他情况下,我们自己也可以充当CA来生成自己颁发的证书。当然与前者相比缺点很明显:不能获得各个浏览器的信任,会弹出警告提示。如:
好消息是,对安全性要求稍低的网站现在可以考虑使用免费的CA认证(貌似是其级别最低的证书)。
跟VeriSign一样,StartSSL(网址:http://www.startssl.com,公司名:StartCom)也是一家CA机构,它的根证书很久之前就被一些具有开源背景的浏览器支持(Firefox浏览器、谷歌Chrome浏览器、苹果Safari浏览器等)。
在2009年9月份,StartSSL竟然搞定了微软:微软在升级补丁中,更新了通过Windows根证书认证程序(Windows Root Certificate Program)的厂商清单,并首次将StartCom公司列入了该认证清单,这是微软首次将提供免费数字验证技术的厂商加入根证书认证列表中。现在,在Windows 7或安装了升级补丁的Windows Vista或Windows XP操作系统中,系统会完全信任由StartCom这类免费数字认证机构认证的数字证书,从而使StartSSL也得到了IE浏览器的支持。
下面进入正题,首先要生成获得证书所需的密钥等文件:
openssl genrsa -des3 -out test.com.key 1024
openssl req -new -key test.com.key -out test.com.csr
openssl rsa -in test.com.key -out test.com.key
详细图示:
把上面生成的文件内容提交给CA,即可换取证书;若自行生成则:
openssl x509 -req -days 365 -in test.com.csr -signkey test.com.key -out test.com.crt
详细图示:
现在已有这些文件:
-rw-r--r-- 1 root root 936 05-24 19:17 test.com.crt
-rw-r--r-- 1 root root 696 05-24 19:06 test.com.csr
-rw-r--r-- 1 root root 891 05-24 19:07 test.com.key
把它们放到指定目录(例如:/data/ssl/),供下一步使用
二、配置Nginx
(我的测试环境是Linux-2.6.18 + Nginx-0.8.35)
由于http_ssl_module不属于Nginx的基本模块,所以需要加上参数 --with-http_ssl_module 重新编译安装
例如:
./configure --user=username --group=groupname --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
安装完成后修改Nginx配置,开启ssl并监听https的443端口,指定证书和密钥
server
{
listen 443;
server_name www.test.com;
index index.html index.htm index.php;
root /data/www;
ssl on;
ssl_certificate /data/ssl/test.com.crt;
ssl_certificate_key /data/ssl/test.com.key;
......
}
还可以如下设置,以满足特殊需求(http的www域和https的secure域共享images域的资源)
需要特别注意的一点:此时访问开放单个端口的子域时会按端口走,而忽略域名!
ssl_certificate /data/ssl/test.com.crt;
ssl_certificate_key /data/ssl/test.com.key;
server {
listen 80;
server_name www.test.com;
...
}
server {
listen 443 ssl;
server_name secure.test.com;
...
}
server {
listen 80;
listen 443;
server_name images.test.com;
...
}
没意外的话,重启Nginx后即可生效。
自行颁发的证书访问时会出现前文提到的警告框
Firefox的警告如下:
三、参考资料
全球可信并且唯一免费的HTTPS(SSL)证书颁发机构:StartSSL
用Nginx配置https加密站点
Nginx 配置 SSL 证书 + HTTPS 站点小记
nginx + php + https 配置用例
nginx ssl加密代理配置指南
Nginx SSL模块参数配置