问题背景
对于一些涉及隐私以及对安全级别有一定要求的web业务,最简单的做法是走https,如网银、github、google的加密搜索。
当客户端通过https访问web服务时,服务器通过想客户端传递其持有的CA (Certificate Authority)颁发的证书,以证明其可信的身份。然后配合服务器的私钥对会话进行加密,从而保证客户端与服务器“安全”的通信。具体的流程及细节可以参见这个视频。
其实https能提供的安全保护是极其有限的,有很多绕过/攻破这条线,顺利拿到用户数据的案例。其中比较有名的是黑帽09上面的一次公开展示,感兴趣的话,有两篇文章可以研究一下:
- New Tricks For Defeating SSL In Practice – Black Hat
- More Tricks For Defeating SSL In Practice – Black Hat
回到主题,我为自己的LAMP配置SSL证书的原因是升级到iOS 7.1后,以前通过in-house发布的几个app无法安装了,提示“证书错误”。7.1以前,可以通过http的方式把in-house发布的app挂上去,7.1及以后,必须走https。知道原因以后,解决起来就很简单了:
- 生成私钥server.key, server.csr
- 向CA申请证书server.crt
- 配置apache SSL证书
生成私钥server.key, server.csr
可以在线生成,也可以通过openssl自己生成server.key:
openssl genrsa -des3 -out server.key 2048 // 推荐至少2048以上
openssl req -new -key server.key -out server.csr -config openssl.cnf // 生成csr (Certificate Signing Request)
cp server.key server.key.orig // 养成习惯,备份私钥
openssl rsa -in server.key.orig -out server.key // 移除私钥的pass phrase
向CA申请证书server.crt
申请证书的意义在于:因为给我颁发证书的结构是可信的,且我可以证明我持有的这个证书是这个可信结构颁发给我的,因此我也是可信的。
证书的获取一般有两种方式:
- 自己签发证书,这是二逼青年的做法。很不幸,我们的12306.cn同学就是这么搞的。虽然自己签发证书约等于没有安全性,但是天朝人民还找不到第二个在线买火车票的地方,所以,你懂的……
- 向可信CA申请,这是普通青年的做法。之于文艺青年嘛,都去做全球仅有的那几个可信Root CA去了。
CA方面,有人说天朝的基本不靠谱,严重不推荐。我没去深究,有这方面实践经验的同学不妨谈谈。就我个人使用情况来看,推荐两个国外的:
- VeriSign, 产品全面,服务优质,价格也比较贵。提供短期测试证书申请,但是trial测试周期只有30天,且必须在浏览器上加一个测试的根证书,基本没有可用性。如果开发者要测试证书可用性,还不如自己签发一个来的方便。天威诚信主要就代理VeriSign的产品,另外,支付宝就是用的天威的办法的证书。
- StartSSL, 价格低廉,且可以提供免费一年的Class 1证书。免费一年证书申请可以参考这里。
在墙内,中国金融认证中心也在业界做的不错。我手里有一份全球各大CA的价格表,能比官网给出的价格优惠不少,对于创业公司来说还是有必要考虑节省一下这部分开销,感兴趣的可以email我 liudaning[at]gmail.com。
配置apache SSL证书
假设CA颁发的证书为server.crt,对应的私钥为server.key(已移除pass phrase)。apache配置主要有两部分:
- 开启ssl module
- 设置证书和私钥的路径
httdp.conf参考配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
LoadModule ssl<em>module modules/mod</em>ssl.so Listen 443 <VirtualHost *:443> ServerName www.example.com SSLEngine on SSLCertificateFile /path/to/server.crt SSLCertificateKeyFile /path/to/server.key </VirtualHost> |
完成以后,重启apache。