2018年5月6日 星期日

xmpp 加密簡訊自由軟體再出發: conversations 與 gajim 入門教學

Xmpp 是一個古老的開放通訊協定, 所以有很多包袱, 開發者有不少怨言。 如果你跟你的朋友們從零開始尋找簡訊自由軟體, 那麼我會推薦 matrix/riot.im, 以後再撰文介紹。 先前我寫的 xmpp 加密 教學文其中介紹的 ChatSecure, 開發者現在已不再維護; 至於 pidgin 則因為不支援 OpenPGP 而且我沒試出傳圖片的方法, 所以也就暫時先 bye bye 了。 最近終於把兩者的替代品 -- 電腦版的 gajim 跟手機版的 conversations -- 的重要功能試出來。 如果你像我一樣有很多朋友在用 xmpp 通訊協定的話, 現在改推薦這兩套 xmpp 軟體。 這篇新文章用來取代過時的那兩篇。 以下的測試版本是: gajim 0.16.8-3 on lubuntu 17.04 及 conversations 2.1.4 from f-droid。 [2022/10/18 最近剛開始改用 Cheogram, 它是從 conversations 改來的。 目前還沒有使用心得。]

一、 預備

先別急著安裝軟體或註冊帳號! 先聽一下我的心得。 Conversations 還算好用; gajim 的 UI 設計及錯誤訊息則有些令人困惑。 不論哪一套, 使用加密功能之前, 一定要有很清楚的 非對稱式加解密 觀念。 為了避免流於細節 (而且細節太多了!) 本文只解說重要觀念及提醒少部分較易出錯的細節。 讀者必須有能力根據基本觀念自行解讀各種選項及提示/錯誤訊息。 以下是幾個行前重點提醒:

  1. 手機版的 conversations 比電腦版的 gajim 好用很多。 所以我平時幾乎只用 conversations; 有電腦可用時則透過 scrcpy 連線操作手機, 用電腦鍵盤打字比較快。
  2. 加密方式有三個選擇: otr 有點快要被淘汰了 -- 新版的 conversations 不支援 otr。 第二種是 OpenPGP, 但 conversations 對它的支援還不太完整。 所以推薦簡單好用的第三種加密方式: OMEMO。
  3. 以上三種都是非對稱式加解密, 所以 「甲用哪一種方式寄給乙」 (不加密、 omemo、 OpenPGP、 otr) 跟 「乙用哪一種方式寄給甲」 這兩件事是彼此獨立的。 也就是說, 有可能甲寄給乙的訊息採用的是 OpenPGP 加密; 而乙寄給甲的訊息卻是採用 oemeo 加密, 或是根本沒加密。 如果加密失敗, 要先弄清楚是哪一個方向失敗。 當然, 初步測試時, 建議兩邊都先不要加密最簡單。
  4. gajim 詢問: 是否要信任這位收件人的公鑰? 不論是哪一種加密方式, 傳訊息時都採用收件人的公鑰加密。 所以每當第一次傳加密訊息給一位朋友時, 簡訊軟體可能都會問你: 是否信任這把公鑰/這個 fingerprint。 例如右圖是第一次用 OMEMO 傳給這位收件人, gajim 出現綠色警告訊息解釋為何拒絕幫你傳簡訊, 你必須點選他的 fingerprint、 點選 「Trust」 (注意上方的 undecided 變成 trusted)、 再重新傳送一次才會成功。 其餘類推。
  5. conversations 詢問: 是否要信任這部伺服器的公鑰? 另外, 簡訊軟體也會需要跟對方的伺服器傳訊息, 所以每當第一次跟某一部伺服器上的帳號傳訊息時, 它也會問你是否信任這部伺服器 (的公鑰/fingerprint/證書/certificate)。 直接勾選 「信任」 即可。

anti-spam plugin 設定 近幾年 xmpp 上面也出現了類似垃圾信的垃圾對話。 如果你已經有一個 xmpp 帳號, 建議等一下安裝完軟體, 登入帳號之前, 先啟用 anti-spam 功能, 以免一登入就被垃圾對話淹沒、 刪垃圾對話刪到手軟。 我設了一個很簡單的問題: 「What is the name of my work place? 4 letters, all capital.」 答案是 CYUT。 也就是要問一個 「(即使是不認識的) 想跟你聯絡的人應該會知道或很容易搜尋到的問題」, 阻擋垃圾訊息機器人。 不過! 我自己做實驗時, 發現即使輸入正確答案, 還是會被 anti-spam 擋住。 不太確定到底發生了什麼事。 有兩個選擇: (1) 了避免擋掉所有人,只好又把它取消, 繼續忍受 spam :-( (2) 平常還是啟用 anti-spam; 請想要加朋友的人先從其他管道通知你, 再短暫停用 anti-spam。 [2022/10] 還好,現在有了「回報 spam」 的功能 (XEP-0377)之後,spam 的問題好像就消失了。

二、 安裝

安裝 conversations: 很簡單。 從 f-droid 市集 或是 google play 都可以下載安裝。 Conversations 還需要用到 OpenKeychain 來幫它管理 OpenPGP 金鑰, 也建議一併安裝。 如上所說, conversations 對 OpenPGP 支援還不完整, 但如果運氣好的話, 你的 OpenPGP 有可能可以用。

conversations 詢問: 是否要信任這部伺服器的公鑰? 安裝 gajim: 我在 lubuntu 17.10 底下, 直接 apt install gajim 就裝好了。 但若想要使用 OMEMO 加密 (一定要的), 還必須安裝 python-axolotl 套件。 另外, 我也推薦至少安裝以下套件/模組/外掛程式/extension/plugin: 阻擋垃圾對話的 Anti Spam、 用圖片顯示表情符號文字的 Emoticons pack、 加密用的 OMEMO、 以及傳圖檔用的 HttpUpload、 Image、 Url image preview, 如右圖。 [2019/2/16 ubuntu 18.04 還要安裝 gajim-plugininstaller 才能夠安裝外掛模組。]

三、 註冊帳號

Xmpp 服務跟 e-mail 服務或 sip 服務一樣, 都屬於 federated 類型 -- 網路上有很多伺服器, 每個 xmpp 伺服器上有很多人註冊帳號, 就像一個個的城市各自有很多居民一樣。 這些伺服器彼此 "結盟" 成 xmpp 服務網, 所以不同伺服器上的用戶也可以彼此互通。 [這是我對簡訊軟體的最最基本要求。 所以我 (幾乎) 堅持 「無賴不用臉」。] 例如我在 jabber.org 這部伺服器上申請一個名為 ckhung 的帳號, 我的 xmpp id 就是 ckhung@jabber.org 。

你可以從 CryptoParty 推薦的清單 或是更長的 xmpp 免費伺服器清單 當中挑選一個來註冊。 哪一個伺服器比較值得信任呢? 傳遞加密訊息時, 其實並不需要擔心伺服器偷窺; 至於未加密的訊息, 一路上任何一部 router 都有機會窺視訊息內容。 也可考慮到 這裡 查詢某個伺服器的技術評分。 又, 軟體自由協會的 xmpp.slat.org 及朝陽科大的 xmpp.csie.cyut.edu.tw 也都提供免費註冊服務, 兩者都是採用 prosody 所架設的, 站長都是我信任的朋友。 這個網站推薦 prosody; 如果自己要架設, 可參考朝陽資工王德譽老師的 XMPP 即時通訊伺服器 Prosody

conversations 新增帳號有兩個不同的意義 在 conversations 上面, 「在伺服器上建立一個新帳號, 並且要把它加到 conversations 裡面來」 跟 「我已有一個帳號, 要把它加到 conversations 裡面來」 這兩件事放在同一個對話框裡面, 如果 「register new account on server」 有打勾, 就是前者, 沒打勾, 就是後者。

註冊帳號需要自選 id 及自設密碼, 很直覺很簡單; 也可以參考 用 pidgin 或 spark 註冊帳號 或是 我的舊文 「用瀏覽器註冊帳號」 一節。 註冊過程可能會被問到是否信任這個伺服器的證書或指紋 -- 就是 「非對稱式加解密」 當中, 信任伺服器的公鑰的意思。

如果要修改帳號資訊, 例如姓名/暱稱/頭貼等等, gajim 的編輯功能比較完整。 但也要看伺服器是否支援。 試過的幾個伺服器, xmpp.zone 最沒問題; xmpp.slat.org 也可以改頭貼等等; jabber.org 好像不支援頭貼。

四、 加朋友

朋友的三層定義: 清單、 我訂閱你、 你訂閱我 「交朋友」 一個動作, 會產生三個效果, 如右圖:

  1. 在我的朋友清單 (roster) 當中加入此人
  2. 允許他看見我的狀態 (send presence updates)
  3. 追蹤他的狀態 (receive presence updates)

你也可以只追蹤不告知, 或只告知不追蹤; 但這會讓彼此看不到對方的頭貼更新等等。 測試時我不斷跟自己加朋友/斷絕關係, 後來好像有點玩壞掉了。 最終, 還是要把對方徹底從清單 (roster) 當中移除掉, 再重加一次好友, 才又恢復正常。

如果對方沒有用 anti-spam 的話, 可以先啟動對話、 再加朋友。

五、 聊天/傳檔

紅框內的是加密按鈕; 紫框內的是傳檔按鈕 要啟用 OMEMO 或停用 OMEMO 加密, 可以按右圖紅框內的按鈕。

要傳檔案, 可以按右圖紫框內的按鈕。 但是請注意: 傳送的檔案不是直接進入對方的電腦或手機, 而是放在網站上, 有網址! 所以如果沒有加密的話, 請不要傳送私密的文件。 此外, 現在你也可以理解為什麼欠了 HttpUpload 模組, gajim 用戶就無法傳出圖片。

傳檔時, 接收方必須按下 「接受」, 才會開始傳送 傳檔時, 接收方必須按下 「接受」, 才會開始傳送。 接收那一方如果是用 gajim, 但沒有裝 Url image preview, 那麼 gajim 就只會顯示對方上傳的圖檔的網址, 而不會顯示縮圖。 會這麼囉嗦, 是因為 xmpp 最早製定時, 功能超級陽春, 後來是靠著一大堆 XEP (XMPP Extension Protocols) 一點一點補上去的, 所以用起來有一點 「買零件自己組電腦」 的感覺 :-)

至於最近才推出的 conversations 則不需要任何模組, 直接就可以傳圖片, 甚至還可以錄一小段聲音檔或影像檔、 直接傳送、 直接播放。 我猜是因為年輕的作者看多了當代的即時通軟體, 知道應該如何避免 pidgin/gajim 等等舊軟體 「用戶體驗卡卡」 的錯誤。

六、 更多設定

Gajim 的 「編輯=>偏好設定」 跟 conversations 的 「主選單=>settings」 底下有很多設定可以改, 例如:

  1. 你可以決定要不要讓朋友們知道你已讀、 知道你正在打字。
  2. 也可以決定陌生人來訊時要不要顯示提醒。
  3. 設定閒置的時間及訊息。
  4. ...

回報垃圾訊息 [2022/10/13] 有一段時間我的帳號被垃圾訊息淹沒。 今天讀到 Simple Anti-Spam Tips 又搜尋了一下, 發現 gajim 從 1.2.1 開始支援「回報 spam」 的功能 (XEP-0377)! 太好了,讓我來復仇一下...

七、 雜記

out of hosts 錯誤訊息 在 gajim 裡面, 我曾遇過右圖這樣奇怪的錯誤訊息, 整個無法連線。 後來發現是因為不明原因 (我不小心勾到的嗎?) 設定檔 ~/.config/gajim/config 裡面指定要用 tor 上網。 把那句刪掉就好了。 (忘記是哪一句了。 把 ~/.config/gajim 這個目錄改名備份, gajim 會重建一個新的, 就又可以連線。 比對一下就知道要改哪裡了。)

八、 結語

這篇寫了好幾個月, 當中一直卡關。 直到現在, 還有很多奇怪的狀況沒有完全弄懂。 還好有軟體自由協會理事長 好馬哥 很有耐心地跟我一起測試、 一起解決了許多問題, 真是非常感謝! 如果讀者遇到什麼問題, 請把雙方使用的軟體及版本、 雙方帳號的伺服器各是哪個、 採用哪一種加密以及失敗的錯誤訊息或畫面快照留言分享, 協助我改進這份文件。 或是請指出哪裡沒寫清楚, 也很有幫助。 然後我要改測試 matrix/riot.im 了, 應該會簡單很多吧?

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。