用 Let's Encrypt 添加 https 证书

翻译自官方论坛,于 2016-04-01。

1. 添加 web.ssl.template.ymlweb.letsencrypt.ssl.template.yml 模板

注意:如果你正在使用 web.socketed.template.yml不用继续看这篇了。你应该在主机上设置 Let’s Encrypt 的客户端。客户端无法在 unix socket 上进行验证。

templates:
  - "templates/web.template.yml"
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml" # <-- 添加这个

2. 暴露 443 端口

expose:
  - "80:80"
  - "443:443"

3. 给 Let’s Encrypt 添加个注册用邮箱账号

env:
  LETSENCRYPT_ACCOUNT_EMAIL: email@awesomedomain.com

4. 运行下列命令

  1. ./launcher rebuild <容器名>
  2. 上线 :moneybag:

你可能想在后台开启强制 HTTPS 管理员 -> 站点设置 -> use_https

原理

模板使用了 https://github.com/Neilpang/le

最简单的免费 LetsEncrypt 认证客户端 shell 脚本

简单且强大,只要 3 分钟学习时间。

全部用 Bash 编写,没有 Python 的编译依赖、及其简单。只要一个脚本,就可以签署和自动更新证书。

web.letsencrypt.ssl.template.yml 在启动容器时使用了一个脚本,它会:

  1. 用独立模式下发 Let’s Encrypt 证书。它启动了一个独立的服务器,监听 80 端口。这一步骤在启动容器内的 nginx 之前,所有 80 端口不会被占用。
  2. 把证书安装到 nginx 想要的目录中。同时,增加一个 cron 定时任务做一个每日定时更新的检查。如果证书没过期,就不执行任何操作。
  3. 设置 webroot 至 /var/www/discourse/public。这样可以用 nginx 来当做验证服务器。更新证书的时候也不用下线!

除错

检查日志排除证书安装错误

运行 ./launcher logs <容器名> 然后找找关于 /etc/runit/1.d/letsencrypt

测试证书签署

./launcher enter app
STAGE=1 FORCE=1 LE_WORKING_DIR=/shared/letsencrypt /shared/letsencrypt/le.sh issue no 域名.com no 4096
1赞

直接写个邮件地址就行吗?邮件地址是否需要在证书官网注册?

试一试你就知道了。邮件是给 acme protocol 用的,Let’s Encrypt 没有注册账户的地方。不过你还是要填一个有效的,更新的时候应该会用上

如何取消?我把代码都删了之后,rebuild了之后还是默认https开头,而且后台没有开启,强制https

浏览器缓存了 https 记录,这个叫 HSTS,用浏览器的清除浏览记录就行了

能不能请教站长一下,我装系统的时候,安装官方的提示自动把这个证书安装好了,而且也没有报错,但浏览器就是打不开网址呢?加了https:// 也不打开。
另外请问,安装这个证书之后,是否必须要安装 nginx ?

谢谢!

先看看别的浏览器/电脑或者手机能不能开。能的话是缓存上的问题,清空浏览器的 cookies 那些数据。

还有问题的话,你还用了哪些模版?这个模版今天有升级,可以再重建一次。

最后用这个模板的话,你不应该再安装 nginx。不然的话,你应该在最外面那个 nginx 先处理 ssl 然后再转发给 Discourse。

1赞

已经安装好了,原因是注册邮箱不能和联系邮箱相同。
请教站长,我看这个证书的有效期限只有3个月?是不是使用起来有什么限制?我也懒得去搞清楚如何升级或付费。

谢谢。

Let’s Encrypt 就是免费的证书,3 个月内脚本能够自动续期。Discourse 官方会维护这些,只要你用了模板就行。

1赞

直接写个邮件地址就行吗?邮件地址是否需要在证书官网注册?

按照教程修改app.yml重建报错:

请问是网络问题吗?

哎。果然是网络的问题,重试几次就可以了。

1赞

可以,而且网站没注册的地方