Я хочу настроить экземпляр Синапс за nginx для обратного проксирования. Поскольку nginx настроен с использованием TLS для HTTPS, этот несколько устаревший пост в блоге рекомендует настроить матричный синапс с материалом TLS, уже используемым в vhost nginx, поскольку это материал TLS, который будут видеть другие серверы при разговоре с моим экземпляром.
Пока мне удалось настроить сервер так, чтобы он работал сам по себе, и пользователи на этом экземпляре могли разговаривать друг с другом. Основная проблема - это связь между серверами и двумя серверами, или, как называют это ребята из матрицы, «федерация».
Это моя настройка 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, синапсу этот сертификат нужен только для представления отпечатка пальца для других экземпляров синапса, и он фактически игнорирует key_path.
Я убедился, что этот экземпляр синапса доступен через браузер и что подписи можно получить вручную. Но, к сожалению, первоначальное рукопожатие при общении с другими экземплярами не удается.
У меня есть доступ к другому хосту с его собственным экземпляром синапса (который не находится за обратным прокси-сервером), и я могу просматривать его файлы журнала во время процесса установления связи. В его лог-файле появляются следующие ошибки: SynapseError: 401: No key for matrix.simonszu.de with id ['ed25519:a_LiWb']
.
Дальнейшие поиски в Google привели меня к инструменту под названием 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?
Синапс обратного проксирования 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