反向代理背后的 Matrix Synapse 产生“指纹问题”错误

反向代理背后的 Matrix Synapse 产生“指纹问题”错误

我想设置一个实例突触位于 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

相关内容