基於 xmpp 的即時聊天

國內的互聯網服務越來越流氓,現在微信已經需要實名驗證才能加入羣聊。早在微信剛出來的時候,就非常流氓的會要求導入手機通訊錄。同樣的超級流氓,還包括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)是採用聊天室的方式實現的,也就是開一個羣聊的服務,比如jabber.ru服務器會單獨開一個conference.jabber.ru來幫助大家實現多人聊天。想要羣聊需要先建立一個房間,比如[email protected],然後其他人加入到這房間裏即可多人聊天了。多人聊天是個可選服務,很多服務器提供商提供了,有些則沒有提供。因此缺點就是羣聊不是很方便,在現在很多聊天軟件已經可以非常輕易加人構成羣聊的情況下,這種方式多少還有點低端,與傳統的QQ羣聊很類似。

申請XMPP(Jabber)帳號

因爲Jabber/XMPP是可以跨服務器的(也可以在服務器端禁用這個功能),這樣只要有一個帳號就行就可以與所有人公開的人通信。這裏推薦使用[https://xmpp.net/directory.php](點表頭就可以排序)網站列出來的公共服務器列表。右側兩欄是安全評級,分別是客戶端-服務器端(C2S)安全評級,以及服務器與服務器(S2S)之間的安全評級。A級爲最高,F爲最差。

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

  • xmpp.jp:服務器已經遷移到AWS東京機房了。主要優勢是安全性非常好,速度也挺快。因此綜合考量是最佳選擇。
  • dukgo.com:著名的非追蹤搜索引擎 DuckDuckGo 旗下的 XMPP 服務。安全性和速度都不錯。如果不在亞洲地區,這個服務器是最好的。
  • swissjabber.org: 蘇黎世的服務器,老牌Jabber提供商。速度略慢,安全性也還不錯。值得作爲後備帳號使用。綜合能力不輸給其他的。
  • jabber.otr.im:這個服務器強制要求 OTR 加密,提供了較強的安全性,同時速度也不慢。追求極佳安全性的時候可以考慮。
  • wtfismyip.com:服務器在美國,AWS的雲主機,ping值穩定在300多ms。其優勢是安全性極佳。速度也不慢,同時還支持Tor和暗網。因爲是AWS雲主機,我認爲穩定持久可能會不能保證,帶寬可能比較少。追求極佳安全性的時候可以考慮。

選好服務器以後,如何註冊呢?因爲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加密聊天。

Gajim下的基本聊天

 

手機移動端。Android和iOS都可以用ChatSecure,一款知名的支持OTR的XMPP/Jabber的手機軟件,很是方便。但如果希望支持PGP,則推薦使用Conversations,Android用戶可以用過F-Droid非常容易的安裝(這款APP在Google Play竟然是收費的!)。

Android 下的客戶端 ChatSecure

 

 

連接XMPP/Jabber,享受聊天

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

[email protected]

這樣的形式有很大的好處,不用費勁去記憶大量無意義的號碼了,更可以不用擔心微信號衝突的問題。不過這也帶來很大的缺點,就是有可能冒用身份。某人冒用了他人的XMPP/Jabber賬戶,容易產生一些問題。唯一的辦法的是通過類似openPGP/GPG這樣的方式來標明身份。這也就是爲什麼我青睞使用Psi+或者mmcabber這樣客戶端的。因爲可以使用openPGP/GPG密鑰來簽名登錄服務器,這樣的好處是大大降低了身份被冒用的風險。

因此,添加好友,或者散發自己的XMPP/Jabber賬戶的時候,就可以這樣以郵件地址的方式散佈。很關鍵的一點是要告知別人如何認證你的身份,製造身份的唯一性。

私密聊天

目前常用IM的端對端私密聊天方式主要有兩種,分別是OTR(Off The Record)OpenPGP,這兩種都是利用非對稱加密的原理,實現加密聊天。

OTR是XMPP/Jabber協議裏提倡的加密方式,優點是速度快,可以快速建立鏈接,利用Deffi-Hellman密鑰交換算法和前向加密原理,可以快速加密信息,並且保證安全。缺點也有,由於是基於客戶端的,如果更換客戶端,或者多終端登錄的時候無法保證身份一致性,這要求聊天對方信任我的所有客戶端密鑰,這問題會導致僞造身份出現。

Gajim 下的 OTR 加密聊天

 

對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拉拉雜雜的先說這麼多,有空我可以再基於具體客戶端,寫一個圖文的教程。目前來看,移動互聯網時代,分佈式去中心化一定是大勢所趨,所以我覺得必須要解決的問題就是讓開源的協議和客戶端儘快流行起來。總之,大家都用起來,早日屏蔽流氓軟件,這條路一定不會很順利,畢竟人間正道是滄桑。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章