kazeno memo

メモとか

ProtonMail Bridgeの代替OSS「Hydroxide」をTor経由で使う

ProtonMail Bridgeとは

ProtonMail Bridgeは、ProtonMailをThunderbirdOutlookなどの一般的なEmailクライアントと統合できるソフトウェアです。

ProtonMail側とBridgeがHTTPSのAPIで通信、Emailクライアントは、ローカルのSMTP/IMAPサーバーを実行するBridgeと通信する仕組みです。

この機能は有料会員限定の機能として提供されていますが、2020年4月にはソースコードが公開されています。

Hydroxideとは

HydroxideSimon Serさんが開発している、Bridgeの非公式オープンソース実装です。Go言語で開発されています。

Bridgeと違い、CLIのみでGUIは提供されていません。また、Debianなど主要なLinuxディストリビューション用のパッケージは配布されておらず、自分でビルドする必要があります。(VoidLinuxのxbpsにはありました)

ProtonMail APIとOnion Service経由で通信

Hydroxideはデフォルトで、「https://mail.protonmail.com/api」と通信するようですが、ProtonMailのAPIはOnion Service(.onionアドレス)経由でもアクセス可能です。

Onion Serviceを使用する利点として、クライアント側IPアドレスの秘匿、E2EE(ただし、これはHTTPSのみで満たしているが)などが挙げられます。

ビルド

HydroxideをビルドするにはGo 1.13以上が必要です。

Debianの場合、APTでgolangパッケージをインストールします。Busterのリポジトリだと1.11なので、Backportsリポジトリを使用してください。

# apt install -t buster-backports golang

//Goのバージョン確認
$ go version

HydroxideのGitリポジトリから、ソースコードをCloneします。

$ git clone https://github.com/emersion/hydroxide.git
$ cd hydroxide/

ソースコードの修正

Onion Serviceを経由で通信するようにソースコードを修正します。

修正するファイルは、auth.gomain.goの2つです。

//main.goの「mail.protonmail.com」を「protonirockerxow.onion」に置き換え
$ sed -e 's/mail.protonmail.com/protonirockerxow.onion/' cmd/hydroxide/main.go

//auth.goの「http://www.protonmail.ch」を「https://protonirockerxow.onion」に置き換え
$ sed -e 's/http:\/\/www.protonmail.ch/https:\/\/protonirockerxow.onion/' protonmail/auth.go
  • 追記(2023/03/22): ProtonMailのブランド変更に伴ってドメイン名が変わったので書き換えてください

    mail.protonmail.com mail.proton.me
    protonirockerxow.onion protonmailrmez3lotccipshtkleegetolb73fuirgj7r4o4vfu7ozyd.onion

修正できたら、go buildでビルドします。

$ GO111MODULE=on go build ./cmd/hydroxide

ビルドが正常に完了すると、カレントディレクトリにhydroxideという実行ファイルが生成されています。

Hydroxideの実行

Onion ServiceにアクセスするにはTorを経由する必要がありますが、torsocksは上手く機能しなかったので、HTTPS_PROXY変数を設定することにします。(torsocksが使えないのは、goがlibcに依存しておらずLD_PRELOADが機能しない為だと思う)

  1. hydroxide authでログインしAPIキーを生成します。

    $ HTTPS_PROXY='socks5://127.0.0.1:9050' ./hydroxide auth <ProtonMail ID>

  2. hydroxide smtp/imapでローカルSMTP/IMAPサーバーを実行します。(サーバーはフォアグラウンドで実行されます。)

    $ HTTPS_PROXY='socks5://127.0.0.1:9050' ./hydroxide smtp

    $ HTTPS_PROXY='socks5://127.0.0.1:9050' ./hydroxide imap

  3. メールクライアントでログインします。

    クライアント毎の設定方法は公式サイトで解説されています。

    パスワードはhydroxide authで生成されたAPIキー、SMTP/IMAPサーバーのアドレスはlocalhostを指定します。

これでメールクライアントからProtonMailを送受信できるようになります。

実際にOnion Service経由でアクセス出来ているか確認するには、--debugオプションを使ってください。

Hydroxideの実行時には必ずHTTPS_PROXY変数を設定する必要があります。忘れると.onionアドレスにアクセスできないとエラーを吐いて、通信エラーになります。(設定し忘れてもリークはしないと思いますが)

パケットキャプチャで雑に確認した限り、生IPのリークはしていなかったです。

メッセージ送信後にエラーが出る

少なくともThunderbird使用時、メッセージ送信後にメッセージを保存できないというエラーが出ます。

これは、(多分)送信済みメッセージをSentフォルダに保存できないということで、HydroxideのIssueを漁っていると言及されていました。曰く、APIの仕様とのこと。

Thunderbirdだと、フォールバックでローカルメールに保存することが可能なようです。