2015-03-26

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

国内的互联网服务越来越流氓,现在微信已经需要实名验证才能加入群聊。早在微信刚出来的时候,就非常流氓的会要求导入手机通讯录。同样的超级流氓,还包括QQ,因其封闭其他开源实现,而自身的Linux客户端早已废置,总之放弃这样的流氓已经刻不容缓!

特别是其后还有无比流氓的天朝官府。如果不想被“有关部门”监视盯守,使用去中心化的,且完全由自由开源软件驱动的相应聊天工具,当然是再好不过了。

因此首先我会想到XMPP(Jabber)协议,Jabber是一个开放源代码形式组织产生的网络实时通信协议。XMPP原本是为即时通讯而量身定制,但由于XML Stanza本身是XML元素,在基于XML灵活发展的特性下,使得XMPP也可以适用其他方面,已经得到了IETF的批准。XMPP与IMPP、PRIM、SIP(SIMPLE)合称四大IM协议主流,在此4大协议中,XMPP是最灵活的。

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)是采用聊天室的方式实现的,也就是开一个群聊的服务,比如 domain.tld 服务器会单独开一个类似 conference.domain.tld 来帮助大家实现多人聊天。想要群聊需要先建立一个房间,比如room@conference.domain.tld,然后其他人加入到这房间里即可多人聊天了。多人聊天是个可选服务,很多服务器提供商提供了,有些则没有提供。因此缺点就是群聊不是很方便,在现在很多聊天软件已经可以非常轻易加人构成群聊的情况下,这种方式多少还有点低端,与传统的QQ群聊很类似。

申请XMPP(Jabber)帐号

因为Jabber/XMPP是可以跨服务器的(也可以在服务器端禁用这个功能),这样只要有一个帐号就行就可以与所有人公开的人通信。推荐到这里自行搜索甄别、选取这些公开的XMPP服务器。

选好服务器以后,如何注册呢?因为XMPP/Jabber对用户注册的后端并没有规定和限制,因此各家服务提供商就各自有自己的数据存储方式,目前主流的XMPP/Jabber服务器都可以连接数据库(比如MySQL)、LDAP服务器、甚至单纯的只是文件存储。当然,这些注册也都是免费的!

常用的注册方式,比如在网页注册,有的则是在客户端直接注册(这也是XMPP协议里支持的)。下面说说客户端注册,至于网页注册嘛,大家可以自己研究咯,反正非常简单。

准备客户端

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

Gajim下的基本聊天

 

手机移动端。Android和iOS都可以用 ChatSecure 或 Zom(也是基于ChatSecure的),一款知名的支持OTR的XMPP/Jabber的手机软件,很是方便(但安桌版已经不再维护)。另外很推荐的app则是Conversations(只支持Android),可以用过F-Droid非常容易的安装。它除了支持 OTR 加密,还支持 OMEMO 和 OpenPGP 加密(从2018年开始的 Conversations 版本 OTR 加密已不再可用)。

Android 下的客户端 ChatSecure

连接XMPP/Jabber,享受聊天

这个过程与其他IM软件几乎没有什么区别了,只是因为客户端不同而造成的操作区别而已,只是注意,如果添加好友,每个人的识别方式,不再是一个号码(类似ICQ或者QQ),或者一个字符串(微信号),这里变成了形如

username@domain.tld

这样的形式有很大的好处,不用费劲去记忆大量无意义的号码了,更可以不用担心微信号冲突的问题。不过这也带来很大的缺点,就是有可能冒用身份。某人冒用了他人的XMPP/Jabber账户,容易产生一些问题。唯一的办法的是通过类似openPGP/GPG这样的方式来标明身份。这也就是为什么我青睐使用Pidgin或者mmcabber这样客户端的。因为可以使用openPGP/GPG密钥来签名登录服务器,这样的好处是大大降低了身份被冒用的风险。

因此,添加好友,或者散发自己的XMPP/Jabber账户的时候,就可以这样以邮件地址的方式散布。很关键的一点是要告知别人如何认证你的身份,制造身份的唯一性。

私密聊天

目前常用IM的端对端私密聊天方式主要有两种,分别是OTR(Off The Record)OMEMO以及OpenPGP,这三种都是利用非对称加密的原理,实现加密聊天。

OTR是XMPP/Jabber协议里提倡的加密方式,优点是速度快,可以快速建立链接,利用Deffi-Hellman密钥交换算法和前向加密原理,可以快速加密信息,并且保证安全。缺点也有,由于是基于客户端的端对端加密,如果更换客户端,或者多终端登录的时候无法保证身份一致性,这要求聊天对方信任我的所有客户端密钥,这问题会导致伪造身份出现(特别注意,Gajim 里的 OTR 加密插件已不再维护,这里不再推荐)。

Gajim 下的 OTR 加密聊天(特别注意,Gajim 里的 OTR 加密插件已不再维护,这里不再推荐)

对OpenPGP的支持并不是每个客户端都有,能够符合XMPP-XEP0027要求的不多,目前Gajim、Psi+和mcabber都可以满足这个需求。openPGP毕竟是面向邮件的非对称加密,因此其速度和效率尚不足以与快速的即时消息相适应。

SSL/TLS连接也很重要,虽然对聊天双方来说都是一样的,但因为多增加了一层加密,使得聊天更加安全。

详细配图教程可以参考这个教程,已经足够清晰。

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

目前自己搭建XMPP/Jabber服务器是非常可行的,常用的方案有很多,我亲测的是 Prosody 以及 ejabberd 这两种。前者更加轻量级,也简单易行,而 ejabberd 有更为强大的配置,可以自行配置强大而独立的XMPP/Jabber服务供他人使用。可以自行在互联网上搜索相关的内容,搭建起来并不复杂。这里有一篇不错的文章,从安全性等方面都做了很多说明,推荐阅读。

特别提醒!

  • 千万不要忘记密码!。大多数XMPP服务提供商并没有提供密码找回功能。因此密码要妥善保管并牢记!
  • 确定主要身份,防止冒用。莫轻信聊天的对方。OTR的方式提供了通过保密问题的方式验证身份,虽然比较LOW,不过却是目前比较好的方法了。另外在使用 OMEMO 加密的时候要验证加入设备的安全性。
  • 一定选择妥善的加密服务。首先登录连接必须是 TLS 加密,若能选择一定考虑服务器是否支持TLSv1.2,因为这是目前比较安全的。另外聊天一定选用OTR或者OMEMO其中一种,一般OTR或OMEMO就够,若对保密要求比较高可以考虑OpenPGP。
  • 安全起见,一定选择自由开源的客户端。这毋庸赘言了!不仅客户端,包括其上的插件也必须是自由开源的。
  • 多人聊天的时候防止外人窜入。我们曾经测试MUA多人聊天的时候,一个俄国人突然窜入我们的房间,并大谈俄日争端的北方四岛问题……所以安全起见,多人聊天的时候设置房间密码比较好,我觉得如果追求最好的多人聊天体验,比如在线开会等,最好的还是IRC。

关于XMPP/Jabber拉拉杂杂的先说这么多,有空我可以再基于具体客户端,写一个图文的教程。目前来看,移动互联网时代,分布式去中心化一定是大势所趋,所以我觉得必须要解决的问题就是让开源的协议和客户端尽快流行起来。总之,大家都用起来,早日屏蔽流氓软件,这条路一定不会很顺利,毕竟人间正道是沧桑。

从现在开始我就弃用QQ和微信了,欢迎加我的XMPP帐号,大家一起畅聊!以下两个均可(必须加密与我聊,不加密一律拒绝并拉黑):

如果想了解更多 XMPP + OTR 的信息可以参见这篇文章:《Debian/Ubuntu用户使用基于XMPP即时通信协议的OTR保护隐私的标准化部署流程》https://hardenedlinux.github.io/cryptography/2018/02/01/pidgin_xmpp_otr_debian.html


UPDATE:

2017年6月21日,修正并添加一些信息,把个人账号换了。

2017年1月26日,修正一些信息,以及增加自建XMPP服务器相关的文章。

2016年11月29日,自己维护的XMPP服务器停止使用。

2016年1月6日,修改了文中提到的一些 XMPP 服务提供商,因为有些已经失效,或者安全性有调整。

You may also like...

16 Responses

  1. Robber Phex says:

    我觉得比较麻烦的是朋友都在用QQ,所以没办法换。

    对了,文中提到的几个服务对其他功能支持如何?比如围绕IM展开的几个功能:音频视频、桌面共享、文件(夹)传输等功能。

    • tonghuix says:

      我们朋友们在用XMPP。这几个服务目前都支持文件传输,音频视频主要看客户端,目前Gajim里面都比较好。目前的桌面共享还没有实现。我突然想音频视频可以用WebRTC技术,比如Firefox Hello

  2. shermanlur says:

    請問pidgin可以使用微信嗎?要如何設定?

  3. loserxc says:

    大神,我用gajim聊天怎么输入的都是英文,右键输入法也改不了,求解

  4. MaryJaneInChain says:

    您的文章对我帮助很大,谢谢!

  1. 2015-04-20

    […] could find what I focus on recently by looking over my previous article, I am working on promoting XMPP-based instant messaging tools and chat with OTR encrypted messaging […]

  2. 2015-05-05

    […] 比如我这个Idea,学生至少应该明白OTR(Off The Record)加密是什么,以及在XMPP聊天中的应用(前面我有写博文讲过);另外还有,学生是否考察过类似的开源项目,查看过相应的代码,考虑过是否可以直接引用到此Idea中,或自己实现的能力。因此在审核Proposal的时候,没能谈到这几点的我都会要求其尽快补上。 […]

  3. 2015-10-11

    […] 比如我这个Idea,学生至少应该明白OTR(Off The Record)加密是什么,以及在XMPP聊天中的应用(前面我有写博文讲过);另外还有,学生是否考察过类似的开源项目,查看过相应的代码,考虑过是否可以直接引用到此Idea中,或自己实现的能力。因此在审核Proposal的时候,没能谈到这几点的我都会要求其尽快补上。 […]

  4. 2016-01-07

    […] 花了一点时间,写了一个XMPP+OTR的快速上手指南。之前曾写过一篇文章,已经安利过XMPP的种种好处了。 […]

  5. 2016-01-19

    […] 花了一点时间,写了一个XMPP+OTR的快速上手指南。之前曾写过一篇文章,已经安利过XMPP的种种好处了。 […]

  6. 2016-08-11

    […] – CSDN.NET XMPP协议的客户端软件列表 – 维基百科,自由的百科全书 弃用QQ和微信!全面转向基于XMPP(Jabber)的即时聊天 | FOSS Geek | 爱开源魅影 搜: XMPP服务器和客户端 参考: Clients – The XMPP Standards Foundation […]