在nginx下配置并使用ssl

嘛,具体的效果可以看https://best33.com,我已经部署了StartSSL的证书了。

首先我们需要一个SSL证书。可以看Freehao123上的文章StartSSL免费SSL证书成功申请-HTTPS让访问网站更安全,也可以在Linux服务器下自签名证书。至于为什么使用StartSSL,无非就是让访客访问的时候不提示“不受信任的安全连接”罢了。自签名的证书和经过CA认证的证书一样是能够保障连接安全的,只是它不被浏览器信任罢了。
Update:在火狐下,如果你的网页有除了https的其它内容,那么火狐仍然会显示你的网页,只是地址栏上没有小锁图标;IE或者某些其它浏览器下,非https的内容压根就不会显示。所以要保证站点引用的都是https的资源,包括css啦,js这些的都要是https的,这样才能显示小锁图标。
在Linux的VPS下要生成一个SSL证书也很简单。首先我们需要生成一个key:

openssl genrsa -des3 -out ssl.key 1024

生成的时候要输入一个密码。因为nginx加载证书的时候会需要输入这个密码,所以我们要把这个密码再去掉。执行:

openssl rsa -in xxx.key -out ssl.key

输入密码后,ssl.key的密码就被去掉了。然后我们用这个key去生成一个csr请求,执行:

openssl req -new -key ssl.key -out ssl.csr

这一步会要输入一大堆的东西。嘛……如果不介意的话一路回车下来就好了。
在这里我们得到了一个csr文件。执行cat ssl.csr就可以看到一堆的被编码的文件,在生成StartSSL的时候可以用到。(在输入密码那一步,点击skip然后粘贴进去。这样的好处就是生成的证书有详细的描述)
得到StartSSL的证书后,把它保存为ssl.crt放到同一个目录下即可。

如果没有StartSSL帮你签名的话,就自签名就好了。将csr请求和key一起生成我们要用到的crt证书,执行:

openssl x509 -req -days 3650 -in ssl.csr -signkey ssl.key -out ssl.crt

然后我们就会在当前目录下得到ssl.key和ssl.crt两个文件。刚刚的ssl.csr可以删掉。
Update:据说如果这个文件不和StartSSL的根证书合并的话,依然不能用。从网上下载StartSSL的根证书并合并到ssl.crt:

wget http://cert.startssl.com/certs/sub.class1.server.ca.pem
cat sub.class1.server.ca.pem >> ssl.crt

然后我们把这两个文件移动到一个合适的地方,比如/home/www/,并给与对应的权限:

mv ssl.* /home/www/
chown www:www /home/www/ssl.*

现在找到nginx的配置文件。我用的是军哥LNMP,那么执行:

vim /usr/local/nginx/conf/vhost/你的虚拟主机名

找到其中的server段,在listen 80;下方加入:

                #ssl config
                listen 443;
                ssl on;
                ssl_certificate /home/www/ssl.crt;
                ssl_certificate_key /home/www/ssl.key;
                ssl_protocols SSLv2 SSLv3 TLSv1;
                ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
                ssl_prefer_server_ciphers on;
                #end of ssl config.

注意把其中的路径换成你的路径。完事之后重启nginx,尝试访问你的https站点吧~

评论

「三三」。

LNMP哪里来的Apache了黑线= =至于LNMPA的话,在前端的nginx绑定就可以了吧?Apache有没有好像不重要的说。

ivmm

需要的。。。不然就是你所说的混合内容出错。静态和动态会不一致,观看文章还好,浏览后台就杯具了

「三三」。

囧= =你nginx反代到apache,apache输出来的是http的,然后经过nginx加密后变成ssl的=-=这样就不会有问题……
当然了,如果是某些博客系统会把你nginx对apache的请求识别为http请求从而在源码中给出绝对地址,就会混合内容了。解决方法其实最好是改相对路径=-=一劳永逸。

免费资源部落

ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
这个代码用来干嘛的?

「三三」。

第一个是限制ssl的协议,SSL第二版、第三版和TLS第一版,三种都是SSL的协议
第二个是限制连接SSL的加密算法……

babytomas

用了 SSL 之后百度不收录,而且访问速度慢了点、还有的就是你那个 HTTPS 是打叉的

「三三」。

无效就无效吧~证书多合并了一个CA,有的浏览器会报无效的。https比较好玩。

郑杰

StartSSL毕竟免费,始终不能达到完美的支持所有浏览器···与其这样,不如去淘宝买一个COMODO的PositiveSSL,9块钱一年~-~。。。

「三三」。

=-=我已经关掉了,只保留了一个子域名一个非标准端口自用~。

发表评论

发表评论代表你授权本网站存储并在必要情况下使用你输入的邮箱地址、连接本站服务器使用的 IP 地址和用户代理字符串 (User Agent) 用于发送评论回复邮件,以及将上述信息分享给 Libravatar Akismet,用于显示头像和反垃圾。