已将博客配置为SSL-ONLY

Google刚刚做出了一个决定,将网站是否通过https访问计入排名权重,虽然目前仅仅只占1%,但是会考虑今后提高权重。作出这一决定的原因主要是愈演愈烈的网络信息窃取案件,特别是NSA事件受到了公众和企业前所未有的关注,信息安全的保护刻不容缓。相信Google的这一做法会对提高互联网整体安全性起到积极推动作用。
趁着这阵风,我也把博客配置为仅能通过https访问。虽然会牺牲一丁点性能,但是安全性提高了不少,国内ISP再也不能通过http劫持来挂广告了,博客里说说GFW坏话分享分享翻墙心得也不会被GFW发现了 ^_^

下面把我具体的配置过程分享下。首先是这次主要参考的几个网页:

https://wiki.mozilla.org/Security/Server_Side_TLS

https://www.startssl.com/?app=42

http://serverfault.com/questions/250476/how-to-force-or-redirect-to-ssl-in-nginx

接着是具体配置过程:

一、申请免费的SSL证书

StartSSL是一个提供长期免费ssl证书的机构,而且它颁发的证书,浏览器的接受率也很高,只要你用的不是太古老的浏览器(IE6去死),基本都没啥问题。个人博客网站也不需要特地花钱买ssl证书,即使是那些廉价的证书,比如Comodo。我的意见是要买就买最贵的,比如VeriSign,要不然就直接用免费的StartSSL足够了。廉价证书买来没意思,最多也就是能免费reissue,而遇到heartbleed这种需要reissue证书的情况实在太少见了。

具体申请过程一Google一大把,这里直接略过。只说一下从StartSSL取得的几样东西:
1. 你的私钥。本文中记作ssl.key
2. 你自己设置的私钥的密码。
3. 你的公钥(证书)。本文中记作ssl.crt
4. 用于登陆StartSSL的个人证书。注册时由StartSSL生成证书并加到你的系统里,可以在Internet选项中将其导出备份。
5. ca.pem & sub.class1.server.ca.pem: CA和StartSSL的证书。

二、处理证书&生成所需文件

1. 导出不含密码的Private key(否则每次Nginx启动时都问你要密码):

openssl rsa -in ssl.key -out /etc/nginx/conf/ssl.key

2. 生成Diffie-Hellman keys:

openssl dhparam -out /etc/nginx/conf/dh2048.pem 2048

3. 如果你忘记保存CA和StartSSL的证书,用下列命令获取它们:

wget http://www.startssl.com/certs/ca.pem
wget http://www.startssl.com/certs/sub.class1.server.ca.pem

然后将你自己的证书和上面两个证书整合到一个文件里。注意这一步非常重要,否则如果只指定你自己的证书的话,Firefox会报sec_error_unknown_issuer错误(Chrome/IE下倒是正常)。

cat ssl.crt sub.class1.server.ca.pem ca.pem > /etc/nginx/conf/ssl-unified.crt

三、配置Nginx

本博客使用Nginx,所以只提供Nginx下的配置方法。
修改网站对应的.conf文件。下面是本博客的一个例子,配置中的各种证书文件路径,需根据个人实际情况修改。

server
        {
                listen  80;
                <strong>listen  443;</strong>
                server_name wordpress.youran.me;
                <strong><em>if ($scheme = http) {
                        return 301 https://$server_name$request_uri;</em>
                }
                ssl on;
                ssl_certificate /etc/nginx/conf/ssl-unified.crt;
                ssl_certificate_key /etc/nginx/conf/ssl.key;
                ssl_dhparam /etc/nginx/conf/dh2048.pem;
                ssl_session_timeout 5m;
                ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
                ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK;
                ssl_prefer_server_ciphers on;
                ssl_session_cache shared:SSL:50m;
                add_header Strict-Transport-Security max-age=15768000;</strong>
                index index.html index.htm index.php default.html default.htm default.php;
                root  /var/www/wordpress.youran.me;
 
                include wordpress.conf;
                location ~ .*\.(php|php5)?$
                        {
                                try_files $uri =404;
                                fastcgi_pass  unix:/tmp/php-cgi.sock;
                                fastcgi_index index.php;
                                include fcgi.conf;
                        }
 
                location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
                        {
                                expires      30d;
                        }
 
                location ~ .*\.(js|css)?$
                        {
                                expires      12h;
                        }
 
                access_log off;
        }

其中粗体字是这次追加的内容,粗斜体部分是将所有http流量301 redirect到https去,保证纯SSL访问。ssl_protocols和ssl_ciphers采用了兼容性比较高的选项,主要考虑到老版本IE及手机浏览器。

修改好以后,用nginx -t -c /path/to/your/conf 命令测试一下,没问题的话就重启Nginx试试效果吧!

四、结尾语

如果你想测试你的网站的SSL强度如何,可以去下面这个网站:

https://www.ssllabs.com/ssltest/analyze.html

会生成详细的评测结果,涵盖了SSL的各种方面。这里贴一下本网站的评测结果:
ssl_validation

还没有评论,快来抢沙发!

发表评论

  • 😉
  • 😐
  • 😡
  • 😈
  • 🙂
  • 😯
  • 🙁
  • 🙄
  • 😛
  • 😳
  • 😮
  • emoji-mrgree
  • 😆
  • 💡
  • 😀
  • 👿
  • 😥
  • 😎
  • ➡
  • 😕
  • ❓
  • ❗
  • 71 queries in 0.399 seconds