![反向代理背后的 Matrix Synapse 产生“指纹问题”错误](https://linux22.com/image/694038/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E8%83%8C%E5%90%8E%E7%9A%84%20Matrix%20Synapse%20%E4%BA%A7%E7%94%9F%E2%80%9C%E6%8C%87%E7%BA%B9%E9%97%AE%E9%A2%98%E2%80%9D%E9%94%99%E8%AF%AF.png)
我想设置一个实例突触位于 nginx 后面,用于反向代理。由于 nginx 为 HTTPS 设置了 TLS,这篇有些过时的博文建议使用 nginx vhost 中已经使用的 TLS 内容来设置 matrix-synapse,因为这是其他服务器在与我的实例通信时将看到的 TLS 内容。
到目前为止,我已经成功设置了服务器,使其可以独立运行,并且此实例上的用户可以相互通信。主要问题是服务器之间的通信,或者矩阵人员称之为“联合”。
这是我在 matrix-synapse 中的 TLS 设置:
tls_certificate_path: "/var/lib/acme/live/matrix.simonszu.de/fullchain"
# PEM encoded private key for TLS
tls_private_key_path: "/etc/matrix-synapse/homeserver.tls.key"
# PEM dh parameters for ephemeral keys
tls_dh_params_path: "/etc/ssl/dhparams/matrix.simonszu.de_dhparams.pem"
# Don't bind to the https port
no_tls: True
上面的博客文章指出,您可以完全注释掉tls_private_key_path
,因为您已将其设置no_tls
为 True (因为每个 TLS 内容都由 nginx 实例管理)。我注意到这实际上不起作用,因为在这种情况下,matrix-synapse 会在不起眼的地方搜索密钥文件。我无法将关联的密钥文件链接到证书,因为密钥管理是由 acmetool 完成的,以从 Let's Encrypt 获取证书,并且如果密钥文件设置了 0600 以外的任何其他文件权限,自动续订过程就会失败。但由于 TLS 内容无论如何都是由 nginx 管理的,因此 synapse 确实只需要此证书来为其他 synapse 实例提供指纹,并且实际上忽略了 key_path。
我已经确保可以通过浏览器访问此突触实例,并且可以手动获取签名。但不幸的是,与其他实例通信时的初始握手失败了。
我可以访问另一台拥有自己的 Synapse 实例的主机(该实例不在反向代理后面),并且能够在握手过程中查看其日志文件。我在其日志文件中收到以下错误:SynapseError: 401: No key for matrix.simonszu.de with id ['ed25519:a_LiWb']
。
进一步谷歌搜索让我找到了一个名为 matrixtool 的工具,可以通过安装,cpan App::MatrixTool
这样我就可以通过命令行检查联合通信。结果也提示我,我的 TLS 设置仍然存在问题:
$ matrixtool server-key matrix.simonszu.de
[INFO] Connected to 5.189.143.28:443
[FAIL] TLS fingerprint does not match any listed
[OK] Verified using origin=matrix.simonszu.de key_id=ed25519:a_LiWb
v2 keys from matrix.simonszu.de:
Key id ed25519:a_LiWb
base64::VF2Cxq3wVEe8NIplwnHK+yKIhdBkgBmzqUfT1k0aMgg
[INFO] Matches cached key
所以,我实际上已经没有主意了。在所有的研究中,我意识到我不是唯一一个遇到这个问题的人,但其他用户的主要解决方案是放弃,并创建一个没有反向代理的矩阵突触安装。所以我去了,并在这里写下了这个问题,以便一劳永逸地澄清:如何在启用 TLS 的反向代理后面正确设置矩阵突触?
答案1
Nginx 反向代理突触看起来应该是这样的:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name matrix.example.com;
location /_matrix {
proxy_pass http://localhost:8008;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
server {
listen 8448 ssl default_server;
listen [::]:8448 ssl default_server;
server_name example.com;
location / {
proxy_pass http://localhost:8008;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
https://github.com/matrix-org/synapse/blob/master/docs/reverse_proxy.md