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協議的附加標準(XEP)里有這個功能,依賴服務器軟件的實現和部署時啟用。

多人聊天。XMPP/Jabber實現多人聊天(MUC,Multiply User Chat)是採用聊天室的方式實現的,也就是開一個群聊的服務,比如 domain.tld 服務器會單獨開一個類似 conference.domain.tld 來幫助大家實現多人聊天。想要群聊需要先建立一個房間,比如room@conference.domain.tld,然後其他人加入到這房間里即可多人聊天了。多人聊天是個可選服務,很多服務器提供商提供了,有些則沒有提供。因此缺點就是群聊不是很方便,在現在很多聊天軟件已經可以非常輕易加人構成群聊的情況下,這種方式多少還有點低端,與傳統的QQ群聊很類似。

申請XMPP(Jabber)帳號

因為Jabber/XMPP是可以跨服務器的(也可以在服務器端禁用這個功能),這樣只要有一個帳號就行就可以與所有人公開的人通信。推薦到這裡或者北京Linux用戶組篩選過的服務商,自行搜索甄別、選取這些公開的XMPP服務器。

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

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

詳細的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的手機軟件,很是方便(但安桌版已經不再維護)。Android上很推薦的app則是ConversationsPix-Art,可以通過F-Droid非常容易的安裝。這兩個都支持 OMEMO 和 OpenPGP 加密,而 Pix-Art 還支持 OTR 加密(它是 Conversations 的分支衍生,推薦首選 Pix-Art)。

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 加密插件已不再維護,這裡不再推薦)。另外 OTR 加密在移動網絡或移動客戶端上經常會出現發送失敗,丟消息或者解密失敗等問題,建議用 OMEMO 加密替代。

Gajim 下的 OTR 加密聊天(特別注意,Gajim 里的 OTR 加密插件已不再維護,這裡不再推薦)

對OpenPGP的支持並不是每個客戶端都有,能夠符合XMPP-XEP0027要求的不多,目前Gajim、Psi+和mcabber都可以滿足這個需求。openPGP畢竟是面向郵件的非對稱加密,因此其速度和效率尚不足以與快速的即時消息相適應。另外 OpenPGP 並不具備前向安全特性,密鑰需要妥善保存。

SSL/TLS連接也很重要,雖然對聊天雙方來說都是一樣的,但因為多增加了一層加密,使得聊天更加安全。

詳細配圖教程可以參考這個教程,已經足夠清晰。

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

目前自己搭建XMPP/Jabber服務器是非常可行的,常用的方案有很多,我親測的是 Prosody 以及 ejabberd 這兩種。前者更加輕量級,也簡單易行,而 ejabberd 有更為強大的配置,可以自行配置強大而獨立的XMPP/Jabber服務供他人使用。可以自行在互聯網上搜索相關的內容,搭建起來並不複雜。這裡有一篇不錯的文章,從安全性等方面都做了很多說明,推薦閱讀。

特別提醒!

  • 千萬不要忘記密碼!大多數XMPP服務提供商並沒有提供密碼找回功能。因此密碼要妥善保管並牢記!
  • 確定主要身份,防止冒用。莫輕信聊天的對方和設備。OTR的方式提供了通過保密問題的方式驗證身份,雖然比較LOW,不過卻是目前比較好的方法了。另外在使用 OMEMO 加密的時候要驗證加入設備的安全性。
  • 一定選擇妥善的加密服務。首先登錄連接必須是 TLS 加密,若能選擇一定考慮服務器是否支持TLSv1.2或TLSv1.3,因為這是目前比較安全的。另外聊天一定選用OTR或者OMEMO其中一種,一般OTR或OMEMO就夠,若對保密要求比較高可以考慮OpenPGP。
  • 安全起見,一定選擇自由開源的客戶端。這毋庸贅言了!不僅客戶端,包括其上的插件也必須是自由開源的。
  • 多人聊天的時候防止外人竄入。我們曾經測試MUA多人聊天的時候,一個俄國人突然竄入我們的房間,並大談俄日爭端的北方四島問題……所以安全起見,多人聊天的時候設置房間密碼比較好,我覺得如果追求最好的多人聊天體驗,比如在線開會等,最好的還是 IRC 或者 Matrix。

目前來看,移動互聯網時代,分佈式去中心化一定是大勢所趨,所以我覺得必須要解決的問題就是讓開源的協議和客戶端儘快流行起來。總之,大家都用起來,早日屏蔽流氓軟件,這條路一定不會很順利,畢竟人間正道是滄桑。

從現在開始我就棄用QQ和微信了,歡迎加我的XMPP帳號,大家一起暢聊!以下兩個均可(必須加密與我聊,不加密一律拒絕並拉黑):

如果想了解更多 XMPP + OTR 的專業信息可以參見這篇文章:《Debian/Ubuntu用戶使用基於XMPP即時通信協議的OTR保護隱私的標準化部署流程》https://hardenedlinux.github.io/cryptography/2018/02/01/pidgin_xmpp_otr_debian.html


UPDATE:

2018年12月26日,基於最新信息更新。

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 […]