Let’s Encrypt旨在为每个站点提供免费的基于SSL证书,以加速HTTP向HTTPS的过渡,恰逢上周HTTP2的发布,对于HTTPS的优化,其速度显著优于HTTP1.x(某些应用场景)
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto run --debug
安装过程中可能会安装较多依赖的第三方库,这对于线上环境无疑是不够友好和安全的,我们可以选择使用docker。
docker run -it --rm -p 443:443 -p 80:80 --name letsencrypt \
-v "/etc/letsencrypt:/etc/letsencrypt" \
-v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
quay.io/letsencrypt/letsencrypt:latest auth
我们利用官方已经制作好的letencrypt镜像
为域名coocla.org生成一个证书
letsencrypt -d coocla.org certonly
如果一切顺利, 查看/etc/letsencrypt将会看到如下结构:
/etc/letsencrypt/ ├── accounts │ └── acme-staging.api.letsencrypt.org │ └── directory │ └── a68aa061212sd65a51234eaeadda9081 │ ├── meta.json │ ├── private_key.json │ └── regr.json ├── archive │ └── coocla.org │ ├── cert1.pem │ ├── chain1.pem │ ├── fullchain1.pem │ └── privkey1.pem ├── csr │ └── 0000_csr-letsencrypt.pem ├── keys │ └── 0000_key-letsencrypt.pem ├── live │ └── coocla.org │ ├── cert.pem -> ../../archive/coocla.org/cert1.pem │ ├── chain.pem -> ../../archive/coocla.org/chain1.pem │ ├── fullchain.pem -> ../../archive/coocla.org/fullchain1.pem │ └── privkey.pem -> ../../archive/coocla.org/privkey1.pem └── renewal └── coocla.org.conf
使用申请的证书及私钥就可以配置web服务器了
注意: 由于letsencrypt CA的证书从2015-11-17日开始才被信任, 如果你使用在此时间之前申请的证书, 可能会遇到浏览器不信任的错误提示.
letsencrypt 通过 ACME() 协议, 使人们可以轻松建立HTTPS服务, 并且在无人干预的情况下可以自动获取浏览器所信任的证书. 实现这些, 需要两步:
1、首先, letsencrypt客户端会向letsencrypt CA(下文简称为:CA)证明web服务器控制一个域 2、其次, letsencrypt客户端(下文简称为:代理)可以请求, 更新, 吊销该域的证书
CA 通过公钥来验证服务器管理员, 当代理第一次与CA通信时, 它将生成一个新的密钥对,并且告诉CA该服务器控制一个或多个域名. 当代理启动时, 将会询问CA需要什么才可以证明该代理控制(管理)域coocla.org, CA将回复一个或多个问题, 需要代理进行证明, 例如CA可能会给代理一个选择:
期间, CA也会提供一个临时的秘钥给代理,要求代理使用该秘钥进行签署, 以证明它所管理的key. 当代理完成CA提供的证明问题后,将会通知CA它已经处于就绪状态,此时如果这些证明问题都通过后, 并且签名也通过后,代理的公钥将会被CA授权管理域coocla.org, 这对秘钥就被称作为授权密钥对, 摘自官网图片:
一旦代理对证书进行颁发、更新或吊销时,只需要简单的将证书的管理信息和授权密钥对发送给CA. 当代理获取证书时,需要构建一个PKCS#10的证书签名请求, 要求CA发行关于域及指定公钥的证书. 通常一个证书签名请求中包含由公钥对应的私钥的签名, 并且后续所有的证书签名请求中代理均会使用授权秘钥进行签名,当CA收到证书签名请求后,它只需要验证这两个签名是否均正常. 如果一切正常,它将使用代理发送的公钥颁发一个证书返回给代理.
吊销证书的过程也类似,代理使用授权秘钥发起吊销的请求到CA,CA来验证请求,如果是这样,它将发表吊销消息到吊销通道中(像CRLs, OCSP),这样浏览器就会知道不应该信任已经吊销的证书.
插件 | 支持验证 | 默认安装 |
---|---|---|
standalone | Y | N |
apache | Y | Y |
webroot | Y | N |
manual | Y | N |
nginx | Y | Y |
所有生成的秘钥和证书均可在/etc/letsencrypt/live/$domain 目录下找到. 这里可以使用链接的方式链接到所需要配置的web服务配置目录下,因为/etc/letsencrypt下的文件将会是最新更新的文件,拥有最新的内容.
/etc/letsencrypt/archive和/etc/letsencrypt/keys 包含了所有的keys、certificates. 只有/etc/letsencrypt/live链接的才是最新的更新内容.
以下文件可以用:
在使用过程中, 必须要使用 chain.pem 或 fullchain.pem, 不能仅仅使用cert.pem, 否则将会引发错误
# 使用4096长度的RSA秘钥
rsa-key-size = 4096
# 总是使用临时测试服务
server = https://acme-staging.api.letsencrypt.org/directory
# 使用指定的地址更新或取消注册的证书
# email = foo@example.com
# 使用文本接口代替ncurses
# text = True
# 使用独立的认证端口443
# authenticator = standalone
# standalone-supported-challenges = tls-sni-01
# 取消webroot的验证. 使用 webroot-path 的值代替它,这个路径是指web服务器的根
# authenticator = webroot
# webroot-path = /usr/share/nginx/html
默认的配置文件从以下几个位置加载:
1、Let’s Encrypt的证书的有效期限是90天,因此使用者必须至少每三个月更新一次你的证书 2、因为letsencrypt的工作原理,代理在向CA发起证书的发行或吊销时,需要能够证明自己可以控制该域名, 所以代理需要运行在域名解析的那台服务器上
更新证书只需要使用相同的值再次执行 letsencrypt (或 letsencrypt-auto ), 配合相关的CLI命令参数, 或者使用配置文件, 或者配合crontab进行使用