其他博客地址

主力博客:https://tonghuix.io

2015年3月26日星期四

弃用QQ/微信!全面转向基于XMPP(Jabber)的即时聊天

国内的互联网服务越来越流氓,现在微信已经需要实名验证才能加入群聊。早在微信刚出来的时候,就非常流氓的会要求导入手机通讯录。同样的超级流氓,还包括QQ,因其封闭其他开源实现,而自身的Linux客户端早已废置,总之放弃这样的流氓已经刻不容缓!
特别是其后还有无比流氓的天朝官府。如果不想被“有关部门”监视盯守,使用去中心化的,且完全由自由开源软件驱动的相应聊天工具,当然是再好不过了。
因此首先我会想到XMPP(Jabber)协议,Jabber是一个开放源代码形式组织产生的网络实时通信协议。XMPP原本是为即时通讯而量身定制,但由于XML Stanza本身是XML元素,在基于XML灵活发展的特性下,使得XMPP也可以适用其他方面,已经得到了IETF的批准。XMPP与IMPP、PRIM、SIP(SIMPLE)合称四大IM协议主流,在此4大协议中,XMPP是最灵活的。

早期的Google Talk也是这个协议(Hangout已经禁止跨服务器间通讯),Facebook Message也与此兼容。另外国产互联网服务里的新浪微博的私信功能是基于XMPP的,还有据称米聊、人人桌面和陌陌,也是XMPP/Jabber协议的实现。

XMPP的功能和优点

除了常用的IM功能以外,还支持SASL和TLS加密,因为它最大的好处是分布式/去中心化的,这样就使得ISP的封锁和公愤网(GFW)无能为力。当然最重要的是因为多服务器S2S连接,产生的负载均衡效应,这不容小觑。再加它的实现方式依赖XML,因此强大的可扩展性为此增加了非常多的功能。目前XMPP标准基金会负责制订和维护相关标准。
有人认为XMPP不能发图片和传文件,实际上这些都是协议里支持的,主要是依赖客户端支持。试想,如果这些协议不能支持,那么微薄私信的发图功能怎么实现呢?当然了,在XMPP协议层里,语音视频这种SIP也是支持的,有兴趣的可以研究XMPP的Jingle协议。
XMPP也不是没有缺点。一个严重问题是因为全部都由服务器中转,服务器的压力会比较大,特别是高连接数的情况下。另外一个致命问题是某些服务器程序会丢消息(曾有人反映openfire就会丢消息),不过常见的开源软件实现,基本都解决了这问题,有些采用离线消息的方式提供暂存,进而可以解决这些问题。目前我的使用过程中,尚没有发现丢消息的问题。
多点登录,可以用多个设备同时登录(以优先级区分之)。这既是优点也是缺点,优点是多个登录端可以互相通信,缺点是不容易同步。因此若A和B通信,B有3个客户端登录,那么若A给B发送一条消息,只会默认推送到优先级高的客户端上,除非A指定B的某个已经登录的客户端。因此XMPP需要多点同步功能也是需要解决的。
多人聊天。XMPP/Jabber实现多人聊天(MUC,Multiply User Chat)是采用聊天室的方式实现的,也就是开一个群聊的服务,比如jabber.ru服务器会单独开一个conference.jabber.ru来帮助大家实现多人聊天。想要群聊需要先建立一个房间,比如room@conference.jabber.ru,然后其他人加入到这房间里即可多人聊天了。多人聊天是个可选服务,很多服务器提供商提供了,有些则没有提供。因此缺点就是群聊不是很方便,在现在很多聊天软件已经可以非常轻易加人构成群聊的情况下,这种方式多少还有点低端,与传统的QQ群聊很类似。

申请XMPP(Jabber)帐号

因为Jabber/XMPP是可以跨服务器的(也可以在服务器端禁用这个功能),这样只要有一个帐号就行就可以与所有人公开的人通信。这里推荐使用[https://xmpp.net/directory.php](点表头就可以排序)网站列出来的公共服务器列表。右侧两栏是安全评级,分别是客户端-服务器端(C2S)安全评级,以及服务器与服务器(S2S)之间的安全评级。A级为最高,F为最差。
我花了一些时间遴选,既考虑到安全性(必须是A评级),又考虑其提供较多的服务和低ping值。最后可选的服务器如下:
  • xmpp.jp:服务器在日本,北京电信的ping值在50~60ms之间,甚至快过一些国内网站。主要优势是其速度快,安全性也不错(因为支持SSLv3,安全性略低一点点)。综合考量是最佳选择。
  • wtfismyip.com:服务器在美国,AWS的云主机,ping值稳定在300多ms。其优势是安全性极佳。速度也不慢,同时还支持Tor和暗网。因为是AWS云主机,我认为稳定持久可能会不能保证,带宽可能比较少。追求极佳安全性的时候可以考虑。
  • swissjabber.org: 苏黎世的服务器。速度还是很不错的,安全性也还不错。一个传统的服务器,值得作为后备帐号使用。综合能力不输给其他的。
  • jwchat.org:一个较低ping值的美国服务器。安全性也不错,可以作为常用帐号使用。
选好服务器以后,如何注册呢?因为XMPP/Jabber对用户注册的后端并没有规定和限制,因此各家服务提供商就各自有自己的数据存储方式,目前主流的XMPP/Jabber服务器都可以连接数据库(比如MySQL)、LDAP服务器、甚至单纯的只是文件存储。当然,这些注册也都是免费的!
常用的注册方式,比如在网页注册,有的则是在客户端直接注册(这也是XMPP协议里支持的)。下面说说客户端注册,至于网页注册嘛,大家可以自己研究咯,反正非常简单。

准备客户端

PC端肯定要推荐一些比较经典的啦,诸如PidginEmpathyKopeteMiranda IM(只支持Windows)或Adium(只支持Mac OS X)这样的都可以很好的兼容XMPP/Jabber协议,不过呢还有一些专门的客户端软件,比如 GajimPsi+(这是Psi的升级版,增加了更多功能)这样的XMPP专业工具。类似Pidgin这样大而全的软件可以很好的支持XMPP几乎所有的功能(通过各种插件)。而专有的软件则可以更加专注于协议的实现,更加完善,也更加富有使用的优势,特别是需要加密聊天比如OTR和PGP这样的时候,专攻XMPP协议的这些客户端就更方便可靠了。当然还有命令行下的软件,mcabber是专门设计给XMPP/Jabber使用的,可以非常方便的提供OTR和PGP加密聊天。

手机移动端。Android和iOS都可以用ChatSecure,一款知名的支持OTR的XMPP/Jabber的手机软件,很是方便。但如果希望支持PGP,则推荐使用Conversations,Android用户可以用过F-Droid非常容易的安装(这款APP在Google Play竟然是收费的!)。

连接XMPP/Jabber,享受聊天

这个过程与其他IM软件几乎没有什么区别了,只是因为客户端不同而造成的操作区别而已,只是注意,如果添加好友,每个人的识别方式,不再是一个号码(类似ICQ或者QQ),或者一个字符串(微信号),这里变成了形如
username@domain.name
这样的形式有很大的好处,不用费劲去记忆大量无意义的号码了,更可以不用担心微信号冲突的问题。不过这也带来很大的缺点,就是有可能冒用身份。某人冒用了他人的XMPP/Jabber账户,容易产生一些问题。唯一的办法的是通过类似openPGP/GPG这样的方式来标明身份。这也就是为什么我青睐使用Psi+或者mmcabber这样客户端的。因为可以使用openPGP/GPG密钥来签名登录服务器,这样的好处是大大降低了身份被冒用的风险。
因此,添加好友,或者散发自己的XMPP/Jabber账户的时候,就可以这样以邮件地址的方式散布。很关键的一点是要告知别人如何认证你的身份,制造身份的唯一性。

私密聊天

目前常用IM的端对端私密聊天方式主要有两种,分别是OTR(Off The Record)OpenPGP,这两种都是利用非对称加密的原理,实现加密聊天。
OTR是XMPP/Jabber协议里提倡的加密方式,优点是速度快,可以快速建立链接,利用Deffi-Hellman密钥交换算法和前向加密原理,可以快速加密信息,并且保证安全。缺点也有,由于是基于客户端的,如果更换客户端,或者多终端登录的时候无法保证身份一致性,这要求聊天对方信任我的所有客户端密钥,这问题会导致伪造身份出现。

对OpenPGP的支持并不是每个客户端都有,能够符合XMPP-XEP0027要求的不多,目前Gajim、Psi+和mcabber都可以满足这个需求。openPGP毕竟是面向邮件的非对称加密,因此其速度和效率尚不足以与快速的即时消息相适应。
SSL/TLS连接也很重要,虽然对聊天双方来说都是一样的,但因为多增加了一层加密,使得聊天更加安全。

自己搭建XMPP/Jabber服务器:Prosody / ejabberd

目前自己搭建XMPP/Jabber服务器是非常可行的,常用的方案有很多,我亲测的是 Prosody 以及 ejabberd 这两种。前者更加轻量级,也简单易行,而 ejabberd 有更为强大的配置,可以自行配置强大而独立的XMPP/Jabber服务供他人使用。可以自行在互联网上搜索相关的内容,搭建起来并不复杂。
我自己架设了一个测试用的XMPP/Jabber服务器,tonghuix.asia。有兴趣的朋友可以来测试。注意,服务器在墙内且未备案,虽然执行加密,仅可做普通连接和测试使用,不得作为可能涉密的使用。服务器的测试结果:客户端-服务器服务器之间

特别提醒!

  • 千万不要忘记密码!。大多数XMPP服务提供商并没有提供密码找回功能。因此密码要妥善保管并牢记!
  • 确定主要身份,防止冒用。莫轻信聊天的对方。OTR的方式提供了通过保密问题的方式验证身份,虽然比较LOW,不过却是目前比较好的方法了。
  • 一定选择妥善的加密服务。首先登录连接必须是SSL加密,若能选择一定考虑服务器是否支持TLSv1.2,因为这是目前比较安全的。另外聊天一定选用OTR或者PGP其中一种,一般OTR就够,若对保密要求比较高可以考虑OpenPGP。
  • 安全起见,一定选择自由开源的客户端。这毋庸赘言了!不仅客户端,包括其上的插件也必须是自由开源的。
  • 多人聊天的时候防止外人窜入。我们曾经测试MUA多人聊天的时候,一个俄国人突然窜入我们的房间,并大谈俄日争端的北方四岛问题……所以安全起见,多人聊天的时候设置房间密码比较好,我觉得如果追求最好的多人聊天,比如在线开会等,最好的还是IRC。
关于XMPP/Jabber拉拉杂杂的先说这么多,有空我可以再基于具体客户端,写一个图文的教程。目前来看,移动互联网时代,分布式去中心化一定是大势所趋,所以我觉得必须要解决的问题就是让开源的协议和客户端尽快流行起来。总之,大家都用起来,早日屏蔽流氓软件,这条路一定不会很顺利,毕竟人间正道是沧桑。

从现在开始我就弃用QQ和微信了,欢迎加我的XMPP帐号,大家一起畅聊!以下两个均可:
tonghuix@jabber.gnome.org 
tonghuix@xmpp.jp