棄用淪陷區IM!全面轉向基于XMPP(Jabber)的即時聊天

棄用淪陷區IM!全面轉向基于XMPP(Jabber)的即時聊天

tonghuix@orz.chat

淪陷區的互聯網服務越來越流氓,現在微信已經需要實名驗證才能加入群聊。早在微信剛出來的時候,就非常流氓的會要求導入手機通訊錄。同樣的超級流氓,還包括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是可以跨服務器的(也可以在服務器端禁用這個功能),這樣只要有一個帳號就行就可以與所有人公開的人通信。這里推薦使用[https://xmpp.net/directory.php](點表頭就可以排序)網站列出來的公共服務器列表。右側兩欄是安全評級,分別是客戶端-服務器端(C2S)安全評級,以及服務器與服務器(S2S)之間的安全評級。A級為最高,F為最差。


我花了一些時間遴選,既考慮到安全性(必須是A評級),又考慮其提供較多的服務和低ping值。最后可選的服務器如下:


xmpp.is: 德國的服務器,安全性一般,速度也一般,還算不錯。

dukgo.com:著名的非追蹤搜索引擎 DuckDuckGo 旗下的 XMPP 服務。安全性和速度都不錯。如果不在亞洲地區,這個服務器是最好的。

jabber.otr.im:這個服務器強制要求 OTR 加密,提供了較強的安全性,同時速度也不慢。追求安全性的時候可以考慮。

im.koderoot.net:安全性不錯,速度也挺好,整體比較不錯。

選好服務器以后,如何注冊呢?因為XMPP/Jabber對用戶注冊的后端并沒有規定和限制,因此各家服務提供商就各自有自己的數據存儲方式,目前主流的XMPP/Jabber服務器都可以連接數據庫(比如MySQL)、LDAP服務器、甚至單純的只是文件存儲。當然,這些注冊也都是免費的!


常用的注冊方式,比如在網頁注冊,有的則是在客戶端直接注冊(這也是XMPP協議里支持的)。下面說說客戶端注冊,至于網頁注冊嘛,大家可以自己研究咯,反正非常簡單。


準備客戶端

PC端肯定要推薦一些比較經典的啦,諸如PidginEmpathyKopeteMiranda IM(只支持Windows)或Adium(只支持Mac OS X)這樣的都可以很好的兼容XMPP/Jabber協議,不過呢還有一些專門的客戶端軟件,比如 Pidgin 和Psi+(這是Psi的升級版,增加了更多功能)這樣的XMPP專業工具。類似Pidgin這樣大而全的軟件可以很好的支持XMPP幾乎所有的功能(通過各種插件)。而專有的軟件則可以更加專注于協議的實現,更加完善,也更加富有使用的優勢,特別是需要加密聊天比如OTR和PGP這樣的時候,專攻XMPP協議的這些客戶端就更方便可靠了。當然還有命令行下的軟件,mcabber是專門設計給XMPP/Jabber使用的,可以非常方便的提供OTR和PGP加密聊天。

Gajim下的基本聊天

手機移動端。Android和iOS都可以用ChatSecure,一款知名的支持OTR的XMPP/Jabber的手機軟件,很是方便(但安桌版已經不再維護)。另外很推薦的app則是Conversations(只支持Android),可以通過F-Droid非常容易的安装。它除了支持 OTR 加密,還支持 OMEMO 和 OpenPGP 加密。

Android 下的客戶端 ChatSecure

連接XMPP/Jabber,享受聊天

這個過程與其他IM軟件幾乎沒有什么區別了,只是因為客戶端不同而造成的操作區別而已,只是注意,如果添加好友,每個人的識別方式,不再是一個號碼(類似ICQ或者QQ),或者一個字符串(微信號),這里變成了形如


username@domain.name


這樣的形式有很大的好處,不用費勁去記憶大量無意義的號碼了,更可以不用擔心微信號沖突的問題。不過這也帶來很大的缺點,就是有可能冒用身份。某人冒用了他人的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帳號,大家一起暢聊!以下兩個均可:


tonghuix@orz.chat

tonghuix@swissjabber.ch