Discourse 如何不使用 Let's Encrypt 而使用 CA 签名的密钥进行安装

通过访问密钥签发机构上面提供的信息了解到:Let’s Encrypt 针对一个域名只会在一定时间内签发 5 次,如果你超过了签发的次数,你需要 5 天后才能再次申请。

这个可能对你会造成无法安装成功的影响,因为你只有 5 次安装的机会,否则你在安装过程中会得到错误信息如下:

[Sun 04 Oct 2020 04:52:58 AM UTC] Create new order error. Le_OrderFinalize not found. {
  "type": "urn:ietf:params:acme:error:rateLimited",
  "detail": "Error creating new order :: too many certificates already issued for exact set of domains: www.ossez.com: see https://letsencrypt.org/docs/rate-limits/",
  "status": 429
}

使用 CA 签名的域名

我们参考了官方的帮助文档,并且参照我们的平台进行测试后安装成功了。

现将经验分享给大家。

官方的安装 CA 签名密钥内容如下:

购买 SSL

首先你获得已经对你域名签名的密钥,这个密钥通常的格式是 key 和 crt。

如果你对 https 签名的流程还不太了解的话,你可以搜索下相关文章。

最简单的逻辑就是你自己生成一个 key,然后将这个 key 和你的域名信息发给 CA 签发机构,这些机构会对你的信息进行一些审查。因为我们只签名 www 和根域名,这种签名方式是最简单的,只要校验你是不是域名的持有者,基本会发个邮件到你的邮箱中就可以确认了。

当上面的信息确认后,CA 会将你发给他们的 key 进行签名,签名后将结果返回给你,这就是你拿到的 crt。

要对域名进行 https 加密,需要上面 2 个文件就可以了。

将文件上传到服务器

Discourse 对文件的命名有要求,你不能随意命名。不管你签名的域名是什么。你在安装的时候的 key 文件需要命名为 ssl.key,你的 crt 文件需要命名为 ssl.crt。

你不能将你的密钥命名为其他名称,文件名要和上面的要求一致。

文件放置的位置为:/var/discourse/shared/standalone/ssl 路径下面。

配置信息如下表:

文件名 类型 放置路径
ssl.key key 文件 /var/discourse/shared/standalone/ssl/ssl.key
ss.crt crt 文件 /var/discourse/shared/standalone/ssl/ssl.crt

请注意,这个放置的位置是你的服务器的文件路径位置,不是你服务器上安装 docker 容器后,docker 容器内的文件路径。

Discourse-ssl-path

如上图,我们显示的文件路径和文件内容。

如果你服务器上不仅仅只有这 2 个文件,可能还有其他签名的文件的话,请删除其他的文件,只保留这 2 个文件。

修改 app.yml

修改 app.yml 文件中的配置。

app.yml 文件的路径为 /var/discourse/containers/app.yml,可以使用下面的命令进行修改:

vi /var/discourse/containers/app.yml

在这里,有 2 个地方需要注意:

如果

  - "templates/web.ssl.template.yml" 

这一行被注释的话,你需要取消注释。

如果

- "templates/web.letsencrypt.ssl.template.yml"

这一行没有注释的话,你需要注释上。

我们的文件看起来如下:

## Uncomment these two lines if you wish to add Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
#  - "templates/web.letsencrypt.ssl.template.yml"

上面的这个配置这样注释的意图就是,启用 ssl 的配置,但是撤销使用 letsencrypt 的 ssl 签名。

完成上面的修改后,保存退出。

开放端口
你需要进行检查你容器的端口。

你需要查看下你的 app.yml 文件中的端口是否被添加到容器中了。

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

你可以为你的容器开放更多的端口,但是针对 https 和 http ,你需要至少开放 80 和 443 端口。

在上面我们的配置中,我们开放了上述的 2 个端口。

重新编译

在完成上面的所有操作后,进入目录 /var/discourse,然后在这个目录下运行:

./launcher rebuild app

对整个网站进行重新编译。当编译部署完成后,使用命令:

./launcher logs app

查看编译的结果,如果没有任何错误,表示编译部署成功,你的网站应该使用的是你自己的密钥了。

为了保险起见,你可以重启下 docker 容器。

重启 docker 容器的命令是:

systemctl restart docker

校验安装

在完成上面的所有操作后,你就可以通过浏览器访问你的网站的。

在任何浏览器的右上角,单击带锁的图标,然后查看证书。

你可以通过这个链接查看你证书的签发机构,有效期和相关信息,以确定你的证书被正确安装到服务器上了。

希望我们能一起构建更加安全和清洁的网络。