我家里有一台私人服务器,运行着一个 node.js 实例和 weechat。我还有自己的域名,是在 EuroDNS 注册的,还有一个 AlphaSSL 证书,也是从 EuroDNS 获得的。
Weechat 的中继协议和 node.js 都设置为使用 TLS(node.js 配置为拒绝 HTTP 请求,只允许 HTTPS)。奇怪的是,我可以使用任何 HTTPS 客户端通过 HTTPS 访问 node.js 服务器,没有任何问题。openssl s_client
也运行良好。然而,Weechat 的中继协议却不行。出于某种原因,当我尝试打开 TLS 套接字时,中间 EuroDNS AlphaSSL CA 证书似乎没有正确发送,因为客户端报告错误,他们无法验证我的域的证书。更奇怪的是,浏览器似乎没有这个问题,因为发光熊(HTML5 WeeChat 中继客户端)没有这个问题。
我必须手动复制中间 CA 证书 .crt 文件,/usr/share/ca-certificates
然后运行dpkg-reconfigure ca-certificates
才能打开到 Weechat 中继的 TLS 套接字。
我曾经openssl s_client -connect
获取过一些信息。以下是我访问 node.js 服务器时发生的情况(出于隐私原因略作修改):
CONNECTED(00000003)
depth=2 C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = AlphaSSL CA - SHA256 - G2
verify return:1
depth=0 C = DE, OU = Domain Control Validated, CN = example.com
verify return:1
---
Certificate chain
0 s:/C=DE/OU=Domain Control Validated/CN=example.com
i:/C=BE/O=GlobalSign nv-sa/CN=AlphaSSL CA - SHA256 - G2
1 s:/C=BE/O=GlobalSign nv-sa/CN=AlphaSSL CA - SHA256 - G2
i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
---
如果我尝试打开到 Weechat 中继的 TLS 套接字,则会发生以下情况:
CONNECTED(00000003)
depth=0 C = DE, OU = Domain Control Validated, CN = example.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 C = DE, OU = Domain Control Validated, CN = example.com
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
0 s:/C=DE/OU=Domain Control Validated/CN=example.com
i:/C=BE/O=GlobalSign nv-sa/CN=AlphaSSL CA - SHA256 - G2
---
如果我没看错的话,Weechat 显然不会发送中间证书,而 node.js 会。这可能不是浏览器的问题,因为它附带了中间证书。这也解释了为什么当我将中间 AlphaSSL 证书添加到系统证书中时,连接到中继的问题就消失了。
我的假设正确吗?这是否意味着 Weechat 有错误?我对 CA、证书等还不太熟悉,所以我仍在学习这些东西。
答案1
当然,在发布问题后不久,我就找到了答案。我仍然将其保留在这里,以便其他人可以从中学习。
答案是,我添加到 weechat 的 .pem 文件确实将两个证书链接在一起,但出现了错误 - 由于未知原因,那里的中间证书无效。我用 重新创建了链接的 .pem 文件cat my-domain.x509.crt intermediate.crt my-domain.priv.key > relay.pem
,现在它工作正常。