部署 Let's Encrypt 爬坑记

hsl4125 · June 27, 2019 · Last by hsl4125 replied at July 04, 2019 · 7423 hits

Let's Encryptp 爬坑记

个人主页域名申请下来了,下一步就是开启 https。决定用 Let's Encryptp,据说既简单又安全,没想到都是眼泪,于是就有了这篇爬坑记。

打开Let's Encrypt 官网,跟着 Get Started 就到了certbot。乍一看很人性化,什么 nginx,ubuntu18.04 剩下的事情就是跟着步骤一路 copy paste 和 Enter 了吧。接下来就发现自己还是太傻太天真了。先选择的是 default 步骤,报错一看大致意思是 DNS provider 这边被拒绝了。还有个 wildcard 方式啊,也发现了 linode 支持在列。又是一通鼓捣,结果在安装 DNS provider 插件的时候坑了。通过 apt-get 安装没有 python3-certbot-dns-linode 这个包。想了一下直接通过 pip 安装:pip install cert-dns-linode。安装成功,开心的进行下一步。又坑了,报错大致上提示 linode 这个插件是 0.35.1 然后我其它的组件都是 0.31.0 的版本,版本不兼容!google 上查了一下,有个和我一样情况的帖子得到了官方人员的回复:大致意思是说 ubuntu 的源不是他们官方维护的人家无能为力,并给推荐了一种通用的方式Running with Docker。此时我心中有一万头草泥马在崩腾。官方网站上详细描述了安装步骤,出了问题之后轻描淡写的把这个锅甩给了 ubuntu。我就想弄个 ssl 证书,你跟我扯上 Docker 了。除了“干得漂亮”还能说什么。

吐槽无用,想一下怎么解决吧。cerbot 提供的功能无非就是申请好证书,然后再配置 nginx(apache)之类的服务器,把这些繁琐的工作工具化。捷径走不通那就一步步的通过源码来解决问题吧。这次终于成功了。先说一下前提,我的服务器是ubuntu 18.04 LTS(在 linoe 上),nginx 是通过 apt-get 安装的,事先也需要安装好 git,并把你的源更新到最新:sudo apt update && sudo apt upgrade。

接下来说一下用 certbot 生成证书步骤(使用时请将 example.com 替换成自己的域名):

git clone https://github.com/certbot/certbot /opt/letsencrypt

cd /opt/letsencrypt

  • 运行 letsencrypt-auto 脚本(进行这一步之前先停止 nginx 或 apache 服务器,否则会提示你 80 或 443 端口被占用):

sudo -H ./letsencrypt-auto certonly --standalone -d example.com -d www.example.com

  • 接下来一通 Enter 即可。

  • 此时你网站的域名应该有了,验证一下:

sudo ls /etc/letsencrypt/live

example.com
  • 生成证书:

./certbot-auto certificates

Found the following certs: Certificate Name: example.com Domains: example.com www.example.com Expiry Date: 2019-09-27 20:49:02+00:00 (VALID: 89 days) Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem

  • Let's Encryptp 证书有效期为 90 天,这一步搞定自动续期:

./letsencrypt-auto renew

sudo crontab -e

0 0 1 * * /opt/letsencrypt/letsencrypt-auto renew
  • 同理如果你想自动更新 cerbot repository:

sudo crontab -e

0 0 1 * * cd /opt/letsencrypt && git pull

至此证书的生成就完成了,有了证书配置 nginx 就简单许多了,接下来说一下 nginx 配置步骤 (可以参考Configuring HTTPS servers ):

  • 告诉你的 server 哪有证书(/etc/nginx/sites-enabled/example.conf):
server {
    listen              443 ssl;
    server_name         www.example.com;
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ...
}
  • http server 优化配置(/etc/nginx/nginx.conf)
http {
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;
    ...
  • 重启 nginx,享受 https 带来的快乐:

sudo systemctl restart nginx

最后还可以去SSL Server Test验证一下 SSL 是否已经生效了。

原文在博客,刚刚弄好的主页,有点丑,大家凑合看。web 开发我还是个小白,这个项目用来练手,现在 github 上还只是个 private repository。还在持续改进中,过些天会开放出来。

是什么让你不去用大名鼎鼎的acme.sh的呢……

是什么让你不取用超级方便的 dokku letsencrypt

acme.sh 可以使用 dns 级别的验证 生成 wildcard 的证书

acme.sh 已经支持了 ali_dns 了

letsencrypt 现在支持统配证书了,试一试这个 repo,能省不少时间

https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au

Reply to msg7086

Let's Encryptp 默认引导到 certbot,就没用别的

@pynix @lazybios @jicheng1014 请看我的前提:

我的服务器是 ubuntu 18.04 LTS(在 linoe 上),nginx 是通过 apt-get 安装的 .......

那么为什么不使用 caddy 一键申请证书呢

Reply to hsl4125

不影响啊

Reply to hsl4125

统配符证书跟你用什么系统、服务器没有任何关系,是通过域名解析新增 cname 验证的。

我印象中 Lets Encrypt 没有那么多坑啊,很快就弄完了

Reply to levi0214

可能是环境不同导致的吧

hsl4125 closed this topic. 04 Jul 15:58
You need to Sign in before reply, if you don't have an account, please Sign up first.