mewでsakura共有サーバとSSL暗号化通信(IMAP)

mew, SSL, IMAP

GoogleIMAPをサポートしたときにたくさんあった話で、相当に今更感のある記事ですが、忘れっぽいのでメモを残しておきます。環境をMac mini, Yosemiteに変えた際の記録です。

実はIMAPはあんまり関係がなく、mewSSL通信の話です。

準備

クライアント側はhomebrew, openssl, stunnel, emacs, mewが必要です。 サーバ側は、Sakuraの共有サーバです。すでにIMAP over SSLが使える状態です。

大きな流れ

mewの通信自体は、stunnelでサーバとSSL通信を張り(トンネリング)、そのトンネルを通じてIMAP通信を行う、というものです。伝統的なUnixのやり方にのっとり、mewEmacs自体ではSSL通信をしません。外部のツールを使います。 名前からわかるように、stunnelはSecure Tunnelということで、トンネリングするためのツールです。

stunnelでSSL通信ができるようにする

インストール

homebrewを使って、必要なものをインストールします。

$ brew install openssl
$ brew install stunnel

で終わりです。当たり前ですが、stunnelはbrewで入れたopensslにリンクされます。これが大事です。また、普通にopensslコマンドを叩いても、もともとある(古いバージョンの)/usr/bin/opensslが使われてしまいますので、テスト通信をしてみたり、証明書を変更するときの失敗の原因になります。地味にひっかかります。

stunnelとopensslがどういう関係になっているかは、

$ otool -L /usr/local/bin/stunnel

で調べられます。/usr/local/opt/opensslにあるライブラリが表示されたら大丈夫です。

opensslでテスト通信

stunnelでSSL通信をする前に、opensslのクライアントコマンドを使って証明書の検証が解決しているか確認します。これがうまくいかないと暗号化通信が確立できません。

$ /usr/local/opt/openssl/bin/openssl s_client -connect hogehoge.sakura.ne.jp:993  > /dev/null

とやってみましょう。hogehogeは自分のサーバによみかえてください。993はポート番号です。 うまくいったようなら、stunnelで通信可能なので、次は飛ばしてください。逆にもし、証明書が検証できなかった場合には、

verify error:num=20:unable to get local issuer certificate

といったエラーがでます。でてしまった場合には、自分で証明書を取ってきます。

証明書の準備

先ほどのopensslのコマンドで/dev/nullに捨ててしまった出力を出してみると、

Certificate chain
 0 s:/OU=GT90704249/OU=See www.rapidssl.com/resources/cps (c)14/OU=Domain Control Validated - RapidSSL(R)/CN=*.sakura.ne.jp
   i:/C=US/O=GeoTrust Inc./CN=RapidSSL SHA256 CA - G3
 1 s:/C=US/O=GeoTrust Inc./CN=RapidSSL SHA256 CA - G3
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority

と表示されていました。検証できなかったGetTrustの証明書が手元にあれば良さそうです。GeoTrustのサイトからとってきます。 Download Root Certificates - GeoTrust

(2015年時点では)Root1(Equifax)とRoot2(GeoTrust_Global_CA.pem)のpem形式のファイルを取得します。ホームディレクトリの ~/.certs というフォルダをつくり、そこに置いておきましょう。署名書を検証できるようにハッシュをとります。そのためには、~/.certs ディレクトリで、次のコマンドを打ちます。

cp GeoTrust_Global_CA.pem `/usr/local/opt/openssl/bin/openssl x509 -hash -in GeoTrust_Global_CA.pem -noout`.0

Equifaxも同じようにやっておけば大丈夫でしょう。opensslコマンドは必ずhomebrewでインストールしたものをつかってください。MacOSの古いバージョンとは互換性がありません。

これでopenssl通信を行ってみてください。接続可能になるとおもいます。こんなコマンドです。

$ /usr/local/opt/openssl/bin/openssl s_client -connect  hogehoge.sakura.ne.jp:993 -CApath ~/.certs 

mewの準備

mewのマニュアルどおりです。

(setq mew-proto "%")
(setq mew-imap-user "fuga@hogehoge.sakura.ne.jp")  ;; (user-login-name)   
(setq mew-imap-server "hogehoge.sakura.ne.jp")    ;; if not localhost
(setq mew-imap-ssl t)
(setq mew-imap-ssl-port "993")
(setq mew-imap-delete nil)
(setq mew-imap-size 0)
(setq mew-ssl-verify-level 2) ; 本来はいらない

mew-ssl-verify-level を0にセットすると先ほどのOpensslの検証エラーは無視されますが、本来は2にしておいたほうがいいでしょう。また、(setq mew-debug t)と追加しておくとデバッグができます。mewのdebugをみれば、opensslの通信が正しくできているか判別可能です。