lmk123 / blog

个人技术博客,博文写在 Issues 里。
https://github.com/lmk123/blog/issues
623 stars 35 forks source link

未备案域名绑定服务器访问不了的问题原因 #102

Open lmk123 opened 2 years ago

lmk123 commented 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() 方法来给多个域名提供证书。

我没有使用文中的 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.

在网上查了一下,基本上都说是被防火墙给拦截了。看来得找腾讯云问一下了。

更新 1

腾讯云回复说是因为域名 hcfy.app 没有备案导致的,但这不是腾讯云拦截的。嗯……我大概懂了,所以我准备验证一下是不是这样的。

我打算再用一个域名 testapi.limingkai.cn 指向服务器并配置 SSL 证书,然后看看能不能访问。

更新 2

还真是 :joy:

其它有坑的地方

使用 acme.sh 生成证书前,要确保 Cloudflare 里域名的 DNS 记录里没有 "_acme" 开头的 TXT 记录,否则会报 Add txt record error 的错误。