已将博客配置为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
本博客(wordpress.youran.me)使用Nginx,所以只提供Nginx下的配置方法。
修改网站对应的.conf文件。下面是本博客的一个例子,配置中的各种证书文件路径,需根据个人实际情况修改。

server
        {
                listen  80;
                listen  443;
                server_name wordpress.youran.me;
                if ($scheme = http) {
                        return 301 https://$server_name$request_uri;
                }
                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;
                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
看起来已经非常安全了。

本文为悠然居(https://wordpress.youran.me/)的原创文章,转载请注明出处!

3 thoughts on “已将博客配置为SSL-ONLY”

  1. 补充一点,第二步里可以只将你的网站证书和StartSSL证书整合成ssl-unified.crt,CA证书不需要。虽然StartSSL官方教程里将CA证书也整合了进去。

    Google Chrome 37.0.2062.68 Google Chrome 37.0.2062.68 Windows 7 x64 Edition Windows 7 x64 Edition
  2. 用访客身份留个言,测试测试W3 Total Cache。
    WP Super Cache在这次折腾后罢工了,原因不明。
    用了W3 Total Cache,页面响应速度已经很接近http模式

    Firefox 31.0 Firefox 31.0 Windows 7 x64 Edition Windows 7 x64 Edition
  3. 发现百度不收录我的https站点的内容。不过不在乎,Google秒收就行。这年头用百度查资料的怎么好意思说自己是搞IT的

    Google Chrome 36.0.1985.143 Google Chrome 36.0.1985.143 Windows 7 x64 Edition Windows 7 x64 Edition

Leave a Reply to youran Cancel reply

Your email address will not be published. Required fields are marked *