预计阅读时间: 5 分钟
写在前面
在现在这个时代,所有的聊天软件不可避免地会遭到审查,那么如何能够将个人隐私牢牢地掌握在自己手中呢?有不少人使用较为安全的支持e2e加密的软件Telegram,但是国内无法正常访问,本文教你如何搭建类似的e2e加密的国内可以正常使用的聊天软件——Matrix。
Matrix
Matrix是一个去中心化的通讯协议,功能丰富,架构健壮。与客户端直接通讯的服务端可以自行部署,无需担心在国内无法访问。
由于使用的是http api,所以部署非常方便,第三方客户端的开发也十分便捷。目前matrix生态十分丰富,还有不少bot、bridge等增加它的功能。
Synapse
Synapse是一个最常用的matrix服务端软件,使用Python编写,由matrix官方维护,是我们部署matrix服务端的最佳选择。
Matrix官方还有开发一个Golang的版本,但是仍在Beta阶段,短期内不建议部署。
因为Python版本多环境复杂,我们首先考虑使用Docker进行部署,官方的docker 镜像位于Docker Hub
,直接使用问题也不大,有一点小问题我们很快就会讲到。
因为环境变量较多,我们自然是选择docker-compose 来部署和管理,docker-compose的安装教程位于https://docs.docker.com/compose/install/,没有安装的可以按照官网提示安装。
synapse官方有example位于https://github.com/matrix-org/synapse/blob/master/contrib/docker/docker-compose.yml,使用了traefic作为反向代理,不太符合我的需求,在此提供一份我使用的compose file
version: '2.4' volumes: db: name: synapse_db networks: synapse: name: synapse ipam: config: - subnet: 172.23.1.0/24 services: synapse: #image: reg.techminer.org/library/synapse:latest image: matrixdotorg/synapse:latest container_name: synapse # Since synapse does not retry to connect to the database, restart upon # failure restart: unless-stopped # See the readme for a full documentation of the environment settings environment: - SYNAPSE_CONFIG_PATH=/data/homeserver.yaml networks: synapse: ipv4_address: 172.23.1.2 volumes: - ./files:/data depends_on: - db db: image: postgres:12-alpine container_name: synapse_db restart: unless-stopped # Change that password, of course! environment: - POSTGRES_USER=synapse - POSTGRES_PASSWORD=MammalMatrixPretty # ensure the database gets created correctly # https://github.com/matrix-org/synapse/blob/master/docs/postgres.md#set-up-database - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C volumes: - db:/var/lib/postgresql/data networks: synapse:
然后我们docker-compose up -d
就可以开始运行了。
方便起见我把tls放在反向代理上,就不在synapse中配置cert了,印象中Matrix要求使用tls也就是https用于通信,所以一个有效的证书是避不开的了。对于证书我推荐使用Acme.sh,文档见链接。TLS的配置我就不赘述了。
此处需要注意的是反向代理需要一些额外的配置,官方已经有建议,此处列举一个我使用的HAProxy配置。
frontend https bind :::443 v4v6 ssl crt /etc/ssl/haproxy/ strict-sni alpn h2,http/1.1 # Matrix client traffic acl matrix-host hdr(host) -i matrix.example.com acl matrix-path path_beg /_matrix acl matrix-path path_beg /_synapse/client use_backend matrix if matrix-host matrix-path frontend matrix-federation bind :::8448 v4v6 ssl crt /etc/ssl/haproxy/synapse.pem alpn h2,http/1.1 default_backend matrix backend matrix server matrix 127.0.0.1:8008
Client
由于Matrix是一个开放的协议,任何人都可以为它编写客户端。
所有的客户端见官方页面。
目前开发得比较完善的客户端是Element,原名Riot.im。
至此,我们已经安装好服务端和客户端了,可以按照指示创建一个新用户并愉快地开始聊天了。
Known Bugs
Python的Twisted库Bug导致发注册邮件等无法使用TLSv1.2,所以如果使用的邮件服务商不支持旧的TLS版本,那么还需要更改Dockerfile使用nightly的Twisted。 2021-08-03 Update: Twisted库已经修复了这个Bug。
目前其实就算是Element开发得也不是很完善,然后发布版本缺乏测试,经常引入新bug。
还有就是synapse这个服务端是用Python写的,性能非常抱歉,尤其是相当消耗硬盘I/O,3000iops的ssd都能给占满活动时间。
Conclusion
其实主要还是感受一下这样的去中心化即时聊天形式,matrix协议使用的去中心化方式带来的federation查询时主要消耗性能的地方,尤其是对于曾经存在过的HomeServer,Synapse没有做区分,导致不停地重复查询已经不可能查询到的federation API。
如果是真正想要体验良好的聊天体验的话还是建议使用Telegram。
Synapse是否保存了相关的密钥,如果服务器被攻击并获得了完全的控制权限,是否会导致客户端发送的信息泄露呢?
聊天都是E2E加密的,只有参与聊天的人拥有密钥
目前Synapse的文档特别少,不知道博主对这个是否了解深入一些,是否可以一起交流交流。目前自己拉了docker搭了测试的。
Element可以允许用户在服务器上设置密钥的备份 如果用户使用了这个功能 那么Synapse是有机会保存密钥的 不过备份会被一个用户设置的密码保护
synapse不保存密钥。但是有研究指出,Synapse掌握大量了聊天房间的数据。操纵这些数据可以导致群聊内容被解密。攻击者入侵服务器后,可以冒充管理员,给群聊房间加一个影子账户。如果群里有人不警惕乱点信任,信任了影子账户,可能会导致过往的群聊内容被解密并暴露在影子账户眼前。