Open lmk123 opened 2 years ago
在 #99 中,我提到想要将划词翻译服务器的接口地址从 hs-api.limingkai.cn 改为 api.hcfy.app。由于仍然有很多用户使用旧版本的划词翻译,所以目前第一步只能是让服务器同时接收来自 hs-api.limingkai.cn 和 api.hcfy.app 两个地址的访问,这就涉及到在同一个 Node.js 应用里给两个不同的域名提供 SSL 证书。
我大致参考了这篇文章 Multi-domain SSL in Node.JS with Certbot,核心要点就是可以使用 httpsServer.addContext() 方法来给多个域名提供证书。
httpsServer.addContext()
我没有使用文中的 Certbot 生成证书,而是使用 acme.sh 分别为 hs-api.limingkai.cn 和 api.hcfy.app 生成了证书,让后用了以下代码:
const app = new Koa() const server = https.createServer(app.callback()) server.addContext('api.hcfy.app', { key: readFileSync('./acme/api.hcfy.app/api.hcfy.app.key'), cert: readFileSync('./acme/api.hcfy.app/api.hcfy.app.cer'), }) server.addContext('hs-api.limingkai.cn', { key: readFileSync('./acme/hs-api.limingkai.cn/hs-api.limingkai.cn.key'), cert: readFileSync('./acme/hs-api.limingkai.cn/hs-api.limingkai.cn.cer'), }) server.listen(443)
发布上去之后,hs-api.limingkai.cn 确认一切正常,但是 api.hcfy.app 访问不了。可以 ping 通所以 DNS 解析应该是没问题的,尝试用 curl -vvv 访问了一下:
$ curl -vvv https://api.hcfy.app * Rebuilt URL to: https://api.hcfy.app/ * Trying 111.231.115.16... * Connected to api.hcfy.app (111.231.115.16) port 443 (#0) * found 148 certificates in /etc/ssl/certs/ca-certificates.crt * found 596 certificates in /etc/ssl/certs * ALPN, offering http/1.1 * gnutls_handshake() failed: Error in the pull function. * Closing connection 0 curl: (35) gnutls_handshake() failed: Error in the pull function.
在网上查了一下,基本上都说是被防火墙给拦截了。看来得找腾讯云问一下了。
腾讯云回复说是因为域名 hcfy.app 没有备案导致的,但这不是腾讯云拦截的。嗯……我大概懂了,所以我准备验证一下是不是这样的。
我打算再用一个域名 testapi.limingkai.cn 指向服务器并配置 SSL 证书,然后看看能不能访问。
还真是 :joy:
使用 acme.sh 生成证书前,要确保 Cloudflare 里域名的 DNS 记录里没有 "_acme" 开头的 TXT 记录,否则会报 Add txt record error 的错误。
Add txt record error
在 #99 中,我提到想要将划词翻译服务器的接口地址从 hs-api.limingkai.cn 改为 api.hcfy.app。由于仍然有很多用户使用旧版本的划词翻译,所以目前第一步只能是让服务器同时接收来自 hs-api.limingkai.cn 和 api.hcfy.app 两个地址的访问,这就涉及到在同一个 Node.js 应用里给两个不同的域名提供 SSL 证书。
我大致参考了这篇文章 Multi-domain SSL in Node.JS with Certbot,核心要点就是可以使用
httpsServer.addContext()
方法来给多个域名提供证书。我没有使用文中的 Certbot 生成证书,而是使用 acme.sh 分别为 hs-api.limingkai.cn 和 api.hcfy.app 生成了证书,让后用了以下代码:
发布上去之后,hs-api.limingkai.cn 确认一切正常,但是 api.hcfy.app 访问不了。可以 ping 通所以 DNS 解析应该是没问题的,尝试用 curl -vvv 访问了一下:
在网上查了一下,基本上都说是被防火墙给拦截了。看来得找腾讯云问一下了。
更新 1
腾讯云回复说是因为域名 hcfy.app 没有备案导致的,但这不是腾讯云拦截的。嗯……我大概懂了,所以我准备验证一下是不是这样的。
我打算再用一个域名 testapi.limingkai.cn 指向服务器并配置 SSL 证书,然后看看能不能访问。
更新 2
还真是 :joy:
其它有坑的地方
使用 acme.sh 生成证书前,要确保 Cloudflare 里域名的 DNS 记录里没有 "_acme" 开头的 TXT 记录,否则会报
Add txt record error
的错误。