Fork me on GitHub

让我们加密吧Let's encrypt

前言

如今的互联网越来越不安全,我们每个人的信息以及隐私不断被暴露,地下黑产盛行,经常收到垃圾短信,经常被陌生人的电话骚扰。我们的个人信息是怎么泄漏的呢?各种爬虫无时无刻不在互联网爬取着信息,各种嗅探工具无时无刻不在劫持着网络数据包,各种大大小小互联网公司因各种漏洞被脱库。互联网安全非常重要,如今很多大公司都强制使用https加密协议访问,安全性有了很大的提高,最起码数据包不能被劫持了,保证了客户端与服务器端通讯安全性。服端配置加密协议访问,在我的印象中是非常麻烦的,要搞老半天,而且不一定能跑起来。前段时间看了一篇讲解部署https的文章,整个过程简单自动化透明,而且证书是免费的,而且大部分主流操作系统主流浏览器都支持。在部署https之前需要对https协议以及CA证书以及CA有一定了解。

 

Let' encrypt

Let's encrypt是一家不以盈利为目的提供免费CA证书的机构,它旨在让全世界所有的互联网服务能够简单自动化部署加密协议,让https能够在所有的网站中普及。很多著名公司对其提供赞助,比如facebook,思科,mozilla等。它是对ACME(automated certificate management environment)协议的实现,只要实现了ACME协议的客户端都可以跟它交互。

 

实现原理

这里根据自己的理解简单描述下

1.生成用于授权对域名列表证书操作的RSA密钥对
2.客户端询问Let's encrypt获取证书需要做什么?
3.Let's encrypt告诉客户端需要验证是否真的持有域名以及授权私钥,怎么验证呢?告诉客户端把随机字符串保存在这个域名的根目录下指定命名的文件中以及对指定的字段使用授权私钥进行签名并回传


4.当客户端告诉Let's encrypt完成了指定的任务时,服端开始验证签名的有效性,开始通过域名访问指定生成的资源,当都验证通过时,服端认为当前客户端拥有指定域名,可以开始发证书了,当前密钥对被授权用于当前域名相关操作,当前密钥对被称之为账户授权密钥对


5.生成网站证书使用的RSA密钥对,请求获取证书时需要用到
6.根据协议生成CSR(certificate sign request)文件,发起CSR请求,请求Let's encrypt发DV(domain certificate)类型的证书


7.获得证书之后,web服务器就可以开始配置https了

 

获取证书

客户端选择

官方推荐的certbot需要安装比较多的依赖,而且比较重,尝试之后果断放弃了。因为平时使用PHP开发,所以也尝试使用了PHP编写的客户端,没有发现满意的,也果断放弃了。前几天在搜索我之前看到的那篇文章时,那篇文章没有搜索到,搜索到了其它相关的一些文章,其中有篇文章提到了一个很简洁的客户端acme_tiny,使用python实现的,看起来不错,就使用它了。

生成账户私钥对

设置验证域名合法性路径的服端配置并重启服务器(NGINX为例)
location ~ /.well-known/acme-challenge/(.*)? {
    root /u01/server/cert/www;
    try_files /$1 =404;
}

生成网站证书私钥对

生成CSR文件

获取证书

python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /u01/server/cert/www/ > ./signed.crt

获取中间证书

wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem

合并证书

cat signed.crt intermediate.pem > chained.pem

 

NGINX服务器配置
server {
    listen 443;
    server_name yoursite.com;
    charset utf-8;
    root yourroot;
    index index.php index.html index.htm;

    ssl on;
    ssl_certificate /u01/server/cert/chained.pem;
    ssl_certificate_key /u01/server/cert/domain.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;
    ssl_session_cache shared:SSL:50m;
    ssl_prefer_server_ciphers on;
}

 

chrome显示效果

 

 

需要注意的地方

1.证书有效期是90天
2.为了避免滥用,一周内同一个域名只能生成20次
3.开发客户端时,可以使用沙盒环境
4.为了避免证书过期,可以写一个shell脚本自动更新证书
5.使用第三方工具测试OpenSSL是否包含心脏漏血漏洞
6.Let's encrypt创建比较晚,很多老设备老终端老系统可能不能识别
7.脚本需要依赖一些python模块,按照提示安装即可

 

后记

整个部署过程挺顺利的,在部署之前花了一些时间了解相关的文档。使用安全加密协议是有代价的,响应速度比普通协议访问速度慢了将近一倍。

 

参考资料

【1】Let' encrypt
https://letsencrypt.org/
【2】How it works?
https://letsencrypt.org/how-it-works/
【3】证书签名
https://letsencrypt.org/certificates/
【4】acme协议
https://tools.ietf.org/html/draft-ietf-acme-acme-01
【5】let's encrypt docs
https://letsencrypt.org/docs/
【6】acme_tiny
https://github.com/diafygi/acme-tiny/tree/ecd26b1e784973e5b52d5a308964a8e29a6cf207

posted @ 2016-08-04 00:46  huan&ping  阅读(3159)  评论(0编辑  收藏  举报