为博客启用HTTPS和SPDY

好久没有写技术文了 -。-

打开这个网站你就会发现地址栏附近多了一个小锁子,而且”http”也变成了”https”。

这就表示本博客使用了更加安全的加密 https 协议,当然,一个博客自然是用不到这么复杂的技术的,貌似国内连大型门户网站都没有使用 http,其中的原因:今天天气真好啊!

折腾了一天自然是为了下一步计划而准备的,生命不息,折腾不止!最近想要稍微技术储备一下 Web APP,顾名思义就是基于互联网的应用程序,于是准备做几个简单的练练手,也算是投入到云计算的漩涡中去。嗯,又跑题了,这个问题以后再说!

另外本博客还使用了一项技术”SPDY”,这是 Google 公司的一项开源技术,能让加密网络协议的速度更快一点,不过你只能凭感觉体验其中的差距了。如果你使用的 Chrome 浏览器,可以下载一个叫“SPDY indicator” 的扩展程序,之后在地址栏中就可以看到一个绿色的闪电标示了(如果启用了 spdy 技术)。

说了半天,大概记录一下自己的折腾过程,也算是备份吧。其中的过程主要如下:

  • 申请 ssl 证书
  • 为网站启用 https 端口
  • 替换不支持 https 的资源
  • 使用 SPDY 加速网站
  • 强制使用 https 协议

申请SSL证书

ssl证书其实是密码学中的一个概念,这之中并不是大家所熟悉的AES加密(用一把钥匙开锁和解锁),而是另一种非对称密码体制(公钥和私钥)。这之中的概念就不多说了。总之,它可以用来验证网站的唯一性,也可以保证数据传送中的安全性。

其实个人也是可以自己制作加密证书的,但是由于个人的证书没有经过公正方的验证,所以虽然可以保证数据连接的安全性,但是不能保证服务器身份的安全性。为了解决这个问题就需要第三方的认证了,通常个人使用的话建议使用 StartSSL 申请一个免费的证书。

具体的注册方法网上一找一大把,就不在这里重复赘述了。什么,你找不到!?大侠,江湖险恶,你还是不要折腾了吧…

值得一说的是,正规公正机构注册的证书一般都是要收费的,而且价格不菲。StartSSL注册的免费证书不支持泛域名,也就是说不支持 *.domain.com 这样的形式。只能支持 subdomain.domain.com 和 domain.com 两个域名的认证。所以其中一个二级域名我为今后的 Web App 预留了 app.chimin.info 和本博客的一级域名 chimin.info,这样差不多也够用了。

PS. 另外你还需要有一个独立的IP,这个也是必须的哦!

为网站启用 https 端口

一般看我这篇文章的小伙伴都是知道VPS,静态网站,反向代理,Nginx,Appache等这些概念的,所以也就不在这里多废话了(其实实在是太懒了)。

我使用的是 Nginx 作为静态博客的代理,博客的内容先不用做改变,只需要单独修改一下 Nginx 的配置即可。

检查 Nginx 是不是支持ssl

目前一般nginx都是支持ssl模块的,如果你确定你的nginx是支持ssl模块的就可以跳过这一段了。

在终端中输入:

1
nginx -V

如果有结果中可以找到 –with-http_ssl_module 就证明没有问题了,跳过。

反之,说明你的nginx不支持https的连接,要么更新版本,要么自己重新编译一下。

更新配置

重点来了,修改 nginx 的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
   server {
# 同时开启 http 和 https 两个协议,也开启了 ipv6,虽然我自己从来没有用过
listen 80;
listen 443 ssl;
listen [::]:80 ipv6only=on; ## listen for ipv6
server_name chimin.info;
index index.html index.htm;
root /path_to/chimin.info;

access_log /var/log/nginx/blog.access.log;
error_log /var/log/nginx/blog.error.log;

charset utf-8;

### ssl的配置(https) ###
#前面已经在 listen 443 ssl; 中开启了ssl,这里就不要开启了,不然 80 端口的 http 就会出问题
#ssl on;
#证书
ssl_certificate /etc/nginx/cert/ssl_ca.crt;
ssl_certificate_key /etc/nginx/cert/ssl_ca.key;
#证书的缓存,优化选项,提高速度的,可以不用
ssl_session_cache shared:SSL:2m;
ssl_session_timeout 8m;
#证书的加密方式:提高安全性
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers RC4:HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

#保持连接,减少握手次数,降低资源
keepalive_timeout 70;


location ~ \.(php|html|htm)$ {
try_files $uri =404;
index index.html;

fastcgi_pass unix:/var/run/www/php.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /home/zqm/chimin.info$fastcgi_script_name;
# 这一点比较重要,用来端口转发的,添加了这个可以保证你的 phpAdmin 什么的正常使用 https
fastcgi_param HTTPS on;
}

location / {
root /path_to/chimin.info;
index index.html;
}

# cookies 缓存,图片类设置7天过期
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 7d;
}

# cookies 缓存, js|css 类设置 30分钟过期
location ~ .*\.(js|css)?$
{
expires 5m;
}

# 如果遇到 404 未找到就自动跳转到首页
error_page 404 /index.html;
}

修改的差不多了以后再命令行中测试:

nginx -t

嘿嘿嘿,是不是出错了啊??肯定的,没有把证书和公钥的位置指定好怎么行啊!

前面还申请了证书记得吗?将其放到自己指定的位置,我是放到了 /etc/nginx/cert 文件夹中,命名为 ssl_ca.key 和 ssl_ca.crt。

然后再尝试:

1
nginx -t

应该就没有问题了

如果没有什么问题就可以使配置生效了:

nginx -s reload

这个时候可能要提醒你输入密码,如果要输入密码的话以后每次重新启动 nginx 的时候都需要输入密码,这个就去太麻烦了啊!!!

不行,得治:

cd /etc/nginx/cert
openssl rsa -in ssl_ca.key -out ssl_ca.key

这个时候需要输入你生成密钥的时候设置的密码,输入成功以后会得到一个新的密钥,这样重启 nginx 就不用再出入密码了。

还有一个问题,我使用的 StartSSL 签发的证书,个别作国内浏览器可能会无法识别证书链,为了解决这个问题,可以将 StartSSL 的根证书和我的证书合并到一起,这个时候笨笨的浏览器就可以识别了:

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

不过你以为这样就完了估计你就被坑大发了,哈哈哈哈,网上好多教程都没有说下面这个问题哦!!

嗯,修改 ssl_ca.crt:

vim ssl_ca.crt

如果有:

-----END^&*(----------BEGIN^&*-----

修改为:

-----END&*)-----
-----BEGIN&*)(-----

就好了,不然服务器不能识别哦。改到这里以后重启 nginx 就可以正常工作了!

替换不支持 https 的资源

图片

为了提高网站的响应速度,我将图片资源全都保存在了国内的节点中,但是我的服务器是在美国的。

使用 HTTPS 的时候会用户引用了不安全的资源,嗯,这样不好!为了解决这个问题还需要进一步折腾一下。

我将图片都保存在了7牛中,后来发现7牛支持将这些图片资源引用 https 链接,这样的话图片的问题就完美解决了。将之前的连接:

http://name.u.qiniudn.com/^&*)%^&*(%^&

更换成新域名:

https://dn-name.qbox.me/%^&*(^%&*

这样子就没有不安全的提示了,因为都是使用了安全的 https 协议,也不存在安全性缺陷了。

社交评论系统

最初因为汉化和速度原因使用多说评论系统,但是后来发现多说的技术还是不过关,评论统计、评论提醒还有评论导出功能基本上都存在重大Bug。但是本着能用就将就用的原则一直在凑合。

不过现今鸟枪换炮升级成了https,多说就彻底歇菜了!

没有办法,换回了 Disqus 评论系统,现在唯一的缺点就是载入速度有一点慢,到时候看看能不能想点办法改进一下。

使用 SPDY 加速网站

SPDY其实就是 speedy 的缩写,看名字就知道是让网站响应速度变快的东东。听说还有更高级的用法:比如爬墙什么的,但是有了好用的 shadowsocks 就懒得折腾了。

说正事,Nginx 自从 1.4.0 版本就自动继承了 SPDY 模块,所以只要升级到最新版本就可以了。不过鉴于大多数服务器为了稳定性而版本过于落后,所以我更换了 Nginx 的官方源(此官方乃 nginx.org)更新了 1.5.9 版本的 Nginx。

具体的方法网上太多了,如果连这个都找不到就不要折腾了啊,太伤脑细胞了。

算了,还是弄出来吧,免得我自己以后还要找…

PS. 我用的是 ubuntu server,debian 也是一样的。

cd /etc/apt/sources.list.d
wget http://nginx.org/keys/nginx_signing.key
apt-key add nginx_signing.key  
touch nginx.list
vim nginx.list

添加:

deb http://nginx.org/packages/mainline/ubuntu/ raring nginx  
deb-src http://nginx.org/packages/mainline/ubuntu/ raring nginx  

保存后关闭,继续敲命令:

apt-get update
apt-get install nginx

如果安装的时候出错就先删除旧版本,然后清空,再重新安装:

apt-get purge nginx
apt-get autoremove
apt-get install nginx

检查版本:

nginx -v

好了,基本上到了这一步准备就完成了,下一步只要:

vim /etc/nginx/conf.d/chimin.info.conf

将其中的一段:

listen 443 ssl;

改为:

listen 443 ssl spdy;

是不是太简单了一点啊 -.-。

然后重启nginx:

nginx -s reload

就可以实现新效果了,速度快了好多啊。

强制使用 https 协议

好吧,之前说了不使用 https 是不安全的,尤其在公共场合,很多东西都是明文传送的,有些资料是可能被泄露的!!

虽然我的博客不涉及到这一点,但是慢慢养成一个良好的习惯很重要哦,所以…

继续修改nginx的配置文件

vim /etc/nginx/conf.d/chimin.info.conf

加入:

if ($server_port = 80){
    return 301 https://$server_name$request_url;
}
if ($scheme = http){
    return 301 https://$server_name$request_url;
}
error_page 497    https://$server_name$request_url;

这样就可以全方位的保证 http 强制跳转到 https 的正确运行了。

重启一下以后试试效果吧!