--- title: https实践,Let's Encrypt 免费泛域名 SSL 证书申请 tags: [] id: '304' categories: - - 分享 date: 2018-07-12 11:26:42 --- ![let's-encrypt](https://image.dengtongyu.com/blog/2018/07/lets-encrypt.png) 2018 年 3 月 14 日,Let’s Encrypt 对外宣布 ACME v2 已正式支持泛域名证书。这就意外味着用户可以在 Let’s Encrypt 上免费申请支持泛域名的 SSL 证书。 ### 什么是 Let’s Encrypt 部署 HTTPS 网站的时候需要证书,证书由 CA 机构签发,大部分传统 CA 机构签发证书是需要收费的,这不利于推动 HTTPS 协议的使用。 [Let’s Encrypt](https://letsencrypt.org/) 也是一个 CA 机构,但这个 CA 机构是免费的!也就是说签发证书不需要任何费用。 [Let’s Encrypt](https://letsencrypt.org/) 是国外一个公共的免费 SSL 项目,由 Linux 基金会托管。由 Mozilla、思科、Akamai、IdenTrust 和 EFF 等组织发起,目的就是向网站自动签发和管理免费证书。以便加速互联网由 HTTP 过渡到 HTTPS,目前 Facebook 等大公司开始加入赞助行列。 Let’s Encrypt 已经得了 IdenTrust 的交叉签名,这意味着其证书现在已经可以被 Mozilla、Google、Microsoft 和 Apple 等主流的浏览器所信任。用户只需要在 Web 服务器证书链中配置交叉签名,浏览器客户端会自动处理好其它的一切,Let’s Encrypt 安装简单,使用非常方便。 ### 什么是泛域名证书 泛域名证书类似 DNS 解析的泛域名概念,泛域名证书就是证书中可以包含一个通配符。主域名签发的泛域名证书可以在所有子域名中使用,比如 demo.domain.com、bbs.domain.com。这样就一张证书可以用于更多的主机了 ### 如何申请 Let’s Encrypt 泛域名证书 Let’s Encrypt 上的证书申请是通过 ACME 协议来完成的。ACME 协议规范化了证书申请、更新、撤销等流程,实现了 Let’s Encrypt CA 自动化操作。解决了传统的 CA 机构是人工手动处理证书申请、证书更新、证书撤销的效率和成本问题。 ACME v2 是 ACME 协议的更新版本,泛域名证书只能通过 ACME v2 获得。要使用 ACME v2 协议申请泛域名证书,只需一个支持该协议的客户端就可以了,官方推荐的客户端是 Certbot。 #### 安装Certbot 如果没有下载安装过Certbot,先下载Certbot客户端 ``` wget https://dl.eff.org/certbot-auto ``` 然后把certbot-auto设为可执行权限 ``` chmod a+x certbot-auto ``` #### 升级Certbot 如果已经安装了Certbot,查看下自己的Certbot客户端是不是支持 ACME v2 版本,官方介绍 Certbot 0.22.0 版本支持新的协议版本 ``` ./certbot-auto --version Upgrading certbot-auto 0.21.1 to 0.25.1... Replacing certbot-auto... ./certbot-auto --version certbot 0.22.0 ``` 客户在申请 Let’s Encrypt 证书的时候,需要校验域名的所有权,证明操作者有权利为该域名申请证书,目前支持三种验证方式: 1. dns-01:给域名添加一个 DNS TXT 记录。 2. http-01:在域名对应的 Web 服务器下放置一个 HTTP well-known URL 资源文件。 3. tls-sni-01:在域名对应的 Web 服务器下放置一个 HTTPS well-known URL 资源文件。 #### 申请泛域名证书 申请泛域名证书,只能使用 dns-01 的方式 使用 Certbot 客户端申请证书方法比较的简单,输入以下命令: ``` ./certbot-auto certonly -d domain.com -d *.domain.com --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory ``` _1、把domain换成你自己的域名。_ _2、\*.domain.com可作用于所有子域名,但好像不能作用于domain.com,所以加上domain.com这样的裸域名。_ #### 相关参数说明 1. certonly,表示安装模式,Certbot 有安装模式和验证模式两种类型的插件。 2. \--manual 表示手动安装插件,Certbot 有很多插件,不同的插件都可以申请证书,用户可以根据需要自行选择 3. \-d 为那些主机申请证书,如果是通配符,输入 \*.domain.com(可以替换为你自己的域名) 4. \--preferred-challenges dns,使用 DNS 方式校验域名所有权 5. \--server,Let's Encrypt ACME v2 版本使用的服务器不同于 v1 版本,需要显示指定。 执行完这一步之后,就是命令行的输出,请根据提示输入相应内容: ``` Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator manual, Installer None Cert is due for renewal, auto-renewing... Renewing an existing certificate Performing the following challenges: dns-01 challenge for xxxxx.com dns-01 challenge for xxxxx.com ------------------------------------------------------------------------------- NOTE: The IP of this machine will be publicly logged as having requested this certificate. If you're running certbot in manual mode on a machine that is not your server, please ensure you're okay with that. Are you OK with your IP being logged? ------------------------------------------------------------------------------- (Y)es/(N)o: y ``` 上述有两个交互式的提示: 1. 是否同意 Let's Encrypt 协议要求 2. 询问是否对域名和机器(IP)进行绑定 确认同意才能继续。 继续查看命令行的输出,非常关键: ``` ------------------------------------------------------------------------------- Please deploy a DNS TXT record under the name _acme-challenge.xxxxx.com with the following value: XQOqY8npyso******ovtudA3zMd_C1dh9bjMEkbkKHM Before continuing, verify the record is deployed. ------------------------------------------------------------------------------- Press Enter to Continue ``` 执行到上图最后一步时,先暂时不要回车。要求配置 DNS TXT 记录,从而校验域名所有权,也就是判断证书申请者是否有域名的所有权。接下来需要按照提示在域名后台添加对应的 DNS TXT 记录。 上面输出要求给 \_acme-challenge.XXXXX.com 配置一条 TXT 记录,在没有确认 TXT 记录生效之前不要回车执行。 我使用的是阿里云的域名服务器,登录控制台操作如下图: ![泛域名证书](https://image.dengtongyu.com/blog/2018/07/QQ20180711-181503@2x.png) 如上图所示,有两条DNS TXT,因为我们申请的时候就有两个域名,domain.com 和 \*.domain.com,所以我们在阿里云的后台添加一条DNS TXT后,我们回到命令行,按回车继续,然后会输出第二条DNS TXT ``` ------------------------------------------------------------------------------- Please deploy a DNS TXT record under the name _acme-challenge.xxxxx.com with the following value: XQOqY8npyso******ovtudA3zMd_C1dh9bjMEkbkKHM Before continuing, verify the record is deployed. ------------------------------------------------------------------------------- Press Enter to Continue ``` 同样,按照上面的步骤在阿里云的后台多加一条DNS TXT解析就好。加完稍等几分钟后,回到命令行,按回车 ``` Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/dengtongyu.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/dengtongyu.com/privkey.pem Your cert will expire on 2018-XX-XX. To obtain a new or tweaked version of this certificate in the future, simply run certbot-auto again. To non-interactively renew *all* of your certificates, run "certbot-auto renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le Press Enter to Continue ``` 看到上面的输出,说明已经生效。 你也可以输入以下命令确认 TXT 记录是否生效: ``` dig -t txt _acme-challenge.XXXXXX.com @8.8.8.8 ; <<>> DiG 9.10.6 <<>> -t txt _acme-challenge.XXXXXX.com @8.8.8.8 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55138 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;_acme-challenge.XXXXXX.com.INTXT ;; ANSWER SECTION: _acme-challenge.XXXXXX.com.599 INTXT"bQzqaEADZbE******KvPiltbucW130jaj9PNTkAH3mU" _acme-challenge.dengtongyu.com.599 INTXT"XQOqY8npyso******ovtudA3zMd_C1dh9bjMEkbkKHM" ;; Query time: 175 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Thu Jul 12 10:59:20 CST 2018 ;; MSG SIZE rcvd: 171 ``` 到了这一步后,恭喜您,证书申请成功。 证书和密钥保存在下列目录: ``` /etc/letsencrypt/live/xxx.com/ ├── cert.pem ├── chain.pem ├── fullchain.pem └── privkey.pem ``` 然后校验证书信息,输入如下命令: ``` openssl x509 -in /etc/letsencrypt/live/xxx.com/cert.pem -noout -text ... Authority Information Access: OCSP - URI:http://ocsp.int-x3.letsencrypt.org CA Issuers - URI:http://cert.int-x3.letsencrypt.org/ X509v3 Subject Alternative Name: DNS:*.xxx.com ... ``` 可以看到证书包含了 SAN 扩展,该扩展的值就是 \*.xxx.com ### 在 Nginx 中 配置 Let’s Encrypt 证书 Nginx 配置文件片断: ``` server { server_name xxx.com; listen 443 http2 ssl; ssl on; ssl_certificate /etc/letsencrypt/live/XXXXXX.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/XXXXXX.com/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; } } ```