部署 Let's Encrypt 爬坑记

hsl4125 · 2019年06月27日 · 最后由 hsl4125 回复于 2019年07月04日 · 7448 次阅读

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

msg7086 回复

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

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

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

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

hsl4125 回复

不影响啊

hsl4125 回复

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

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

levi0214 回复

可能是环境不同导致的吧

hsl4125 关闭了讨论。 07月04日 15:58
需要 登录 后方可回复, 如果你还没有账号请 注册新账号