使用 Certbot 为服务器安装免费的 https 证书(2018-7-17更新)

随着主流网站使用https越来越普及,并且https的安全性保障,本小站也是心里痒痒想弄这么一个东西,左看右看,先是看到腾讯云有免费证书申请,有效期1年,不错,用上了,后来发现使用 Certbot 这个证书,虽然有效期短,但是可以通过程序自动更新,保证了证书有效期的持续性。本文就是使用 Certbot 生成证书的方法。

Let’s Encrypt 及 Certbot 简介

Let’s Encrypt 是 一个叫 ISRG ( Internet Security Research Group ,互联网安全研究小组)的组织推出的免费安全证书计划。参与这个计划的组织和公司可以说是互联网顶顶重要的先驱,除了前文提到的三个牛气哄哄的发起单位外,后来又有思科(全球网络设备制造商执牛耳者)、 Akamai 加入,甚至连 Linux 基金会也加入了合作,这些大牌组织的加入保证了这个项目的可信度和可持续性。

尽管项目本身以及有该项目签发的证书很可信,但一开始 Let’s Encrypt 的安全证书配置起来比较麻烦,需要手动获取及部署。存在一定的门槛,没有一些技术底子可能比较难搞定。然后有一些网友就自己做了一些脚本来优化和简化部署过程。

后来 ISRG 的发起者 EFF (电子前哨基金会)为 Let’s Encrypt 项目发布了一个官方的客户端 Certbot ,利用它可以完全自动化的获取、部署和更新安全证书。这真是非常容易、方便呀,所以我们就可以直接使用官方客户端,不需要再使用第三方的工具了。虽然第三方工具也可以使用,但是官方工具更权威,风险也更小,而且遇到问题也更容易解决,毕竟有官方的支持。何况 Certbot 确实非常方便,也比所有的第三方工具都更方便,何乐而不用呢?

Certbot 下载与安装

1. 下载

首先我们去 Certbot官网 下载对应自己服务器的脚本,我这里选择的是 Nginx 和 Centos 6

   wget https://dl.eff.org/certbot-auto
   chmod a+x certbot-auto

2. 生成证书

根据官网的步骤,这一步就需要跟Nginx有关联了,届时Certbot会全自动的修改Nginx配置,并完成重启,这也就是通俗说的一键安装,而我又是不喜欢别人碰我得配置文件,所以这里我不需要Certbot帮我修改Nginx配置文件

   ./certbot-auto certonly --webroot --email admin@example.com -w /usr/root -d yulaiz.com -d www.yulaiz.com

中间会有一些自动运行及安装的软件,不用管,让其自动运行就好,顺利完成的话,屏幕上会有提示信息。

注意:由于Certbot的免费性质,所以对于接口的每小时访问次数做了限制,我们可以在命令中增加 --staging 参数来访问他的临时服务器来进行验证

   ./certbot-auto certonly --staging --webroot --email admin@example.com -w /usr/root -d yulaiz.com -d www.yulaiz.com

这里还有一点需要主要,可能大家在网上找教程的时候会发现用的不是 --webroot 参数,而是使用 --standalone 参数,实际上这是Certbot的两种证书生成方式:

  • standalone

    Certbot 会自己运行一个 web server 来进行验证。如果我们自己的服务器上已经有 web server 正在运行 (比如 Nginx 或 Apache ),用 standalone 方式的话需要先关掉它,以免冲突。

  • webroot

    Certbot 会利用既有的 web server,在其 web root目录下创建隐藏文件, Let’s Encrypt 服务端会通过域名来访问这些隐藏文件,以确认你的确拥有对应域名的控制权。这里有官方说明 。并且需要在 Nginx 配置文件中支持访问:

    # for LetsEncrypt
    location ~ /.well-known {
    allow all;
    }
    

    证书生成成功后,会有 Congratulations 的提示,并告诉我们证书放在 /etc/letsencrypt/live/

3. 配置证书到 Nginx

现在证书已经生成了,只需要将 Nginx 配置的证书指向 Certbot 生成的证书即可

我们来了解一下存放证书目录的接口:

  • /etc/letsencrypt/archive/ 目录保存了所有证书的真实证书文件。子目录名为证书名称。
  • /etc/letsencrypt/live/ 保存了所有证书的超链接,指向保存在archive中的真实证书。
  • /etc/letsencrypt/renewal/ 更新证书时需要的配置文件。

    所以 Nginx 只需要指向 live 目录中的证书即可,每次更新证书,live 目录中的证书都是指向的最新证书。

    目录中一共有4个证书文件:

  • privkey.pem :证书的私钥(PKCS#8格式)

  • fullchain.pem :包括了cert.pem和chain.pem的内容
  • cert.pem :服务端证书
  • chain.pem :浏览器需要的所有证书但不包括服务端证书,比如根证书和中间证书

    一般情况下 fullchain.pemprivkey.pem 就够用了

    修改Nginx的 nginx.conf 文件中的ssl配置,并重启Nginx

   server {
       listen 443;
       server_name yulaiz.com;
       ssl on;
       ssl_certificate '/etc/letsencrypt/live/yulaiz.com/fullchain.pem';
       ssl_certificate_key '/etc/letsencrypt/live/yulaiz.com/privkey.pem';
       ssl_session_timeout 5m;
       ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
       ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
       ssl_prefer_server_ciphers on;
   }

4. 证书更新

现在我们的服务器证书已经是配置好了,请求网站时也能识别出https,并带着绿色的安全小锁,但是 Let’s Encrypt 签发的证书有效期只有 90 天,所以需要每隔三个月就要更新一次安全证书,虽然有点麻烦,但是为了网络安全,这是值得的也是应该的。

  • 测试更新(没有在真的更新,只是在调用 Certbot 进行测试)
    ./certbot-auto renew --dry-run
    

    测试结果中,开头有 Congratulations 的字眼就成功了。。。嗯

  • 更新

    ./certbot-auto renew --quiet
    

    --quiet 是静默更新的意思,不在终端中输出信息,需要在日志中查看

5. 一些补充

删除证书 ./certbot-auto delete --cert-name yulaiz.com

6. 补充更新(2018-7-17)

之前自己玩玩玩,然后折腾了一下,删了 /etc/letsencrypt/live 里面的目录(本意是删除证书,需要重新申请),但是删除之后发现删的不彻底,新建的证书生成为了什么-2之类的,导致用于更新证书关联的脚本和程序无法运行,就删了部分配置,修改了配置文件,现在90天过去,我发现更新的不科学,想来想去 certbot-auto 的证书目录反正是自动生成,索性直接将 /etc/letsencrypt 整个目录删除,重新运行证书生成,完成。

注意的是我只有一个域名,别删多了,导致 /etc/letsencrypt/live 目录下的其他域名证书丢失,并且确保还没超出每小时调用的次数限制。

7. 再次补充更新(2018-10-12)

Certbot + Nginx 自动更新证书没有成功的问题

参考链接

使用 let’s encrypt 启动https

HTTPS 简介及使用官方工具 Certbot 配置 Let’s Encrypt SSL 安全证书详细教程

[后端]certbot启用免费https

使用certbot为你的网站免费上https

Let’s Encrypt给你的网站穿上HTTPS的铠甲,防止http劫持

发表评论

发表回复

*

沙发空缺中,还不快抢~