cocolog:91172368
Mew で So-net のメールの SSL 化に対応しようとしたが、かなりダーティなことをしてやっと POP ができた。 (JRF 8973)
JRF 2019年7月19日 (金)
で、再び案内があったので、(setq mew-debug t) にした上で、いろいろ試した結果 pop-port=110 pop-ssl-port=995 で、(setq mew-prog-ssl-arg "sslVersion=TLSv1\n") なら通ることがまずわかった。
JRF2019/7/190638
なぜ、これなら通るのか調べると、どうも、mew-open-ssl-stream するとき mew-ssl-options を呼ぶが、その中の stunnel の config で protocol=pop3 をすると、アウトになることがわかった。で、それをしないようにすると、とりあえず、pop-port=995 であっても POP3 がうまく動くことが確かめられた。
JRF2019/7/196253
でも、プロトコル的にそういうことしていいかはわからない。どちらかと言えばマズそうな気がする。
一応、defadvice するなら、次のようにすればいい。
JRF2019/7/190887
<pre>
(defadvice mew-open-ssl-stream (around mew-open-ssl-stream-pop3-hack)
""
(let ((mew-prog-ssl-arg mew-prog-ssl-arg))
(if (and (string= (ad-get-arg 3) "pop3")
(string= (ad-get-arg 1) "pop.so-net.ne.jp"))
</pre>
JRF2019/7/193832
<pre>
(progn
(ad-set-arg 3 nil)
(setq mew-prog-ssl-arg "sslVersion=TLSv1\n")))
ad-do-it))
</pre>
JRF2019/7/190697
<pre>
(eval-after-load "mew-ssl"
'(ad-activate 'mew-open-ssl-stream))
</pre>
JRF2019/7/192670
(pre タグは取り除いてください。)
今は defadvice を使わないらしいけど、私は古い人間なので…。
JRF2019/7/193425
ちなみに Emacs もかなり古いバージョン(23.3.1)を使っているため、最新の Mew には替えられなくなっている…。まぁ、そのあたりをまずなんとかすべきという話はあるが、フォントがらみとかで、このバージョンが快適なんだよね…。
JRF2019/7/198447
stunnel も古い。Windows 7 で cygwin の stunnel 4.29 を使って、(setq mew-ssl-ver 4) して使っている。まぁ、セキュリティ関連でこんな古いバージョン使うなんて邪道でしかないけど…。しかも、(setq mew-ssl-verify-level 0) で動かしている。orz
JRF2019/7/194627
……。
追記。
(setq mew-ssl-verify-level 2) にしないとまずいかと思い、いろいろ調べてみた。
JRF2019/7/201892
↓を参考に So-net の CA を調べると DigiCert らしい。
《mewでsakura共有サーバとSSL暗号化通信(IMAP) - tranphonic’s blog》
http://tranphonic.hatenablog.com/entry/2015/07/20/194748
www.digicert.com に行って、Firefox の機能で pem を取得し(方法はググれ)、↑に従って、~/.certs にファイルを置く。
JRF2019/7/207903
openssl を使った通信はこれでうまく行くようになった。…が、mew からの stunnel がうまく動かない。
JRF2019/7/206608
いろいろ試すと、stunnel の config で CApath を指定するときに、Windows の Emacs だと expand-file-name が悪さをしていることがわかった。Cygwin の stunnel は c:/なんちゃら/.certs を受け容れないから。
その辺を無理矢理通すには、上のコードを少し変えればいい。
JRF2019/7/202956
<pre>
(defadvice mew-open-ssl-stream (around mew-open-ssl-stream-pop3-hack)
""
(let ((mew-prog-ssl-arg mew-prog-ssl-arg)
(expand-file-name (lambda (x) x)))
(if (and (string= (ad-get-arg 3) "pop3")
(string= (ad-get-arg 1) "pop.so-net.ne.jp"))
</pre>
JRF2019/7/203772
<pre>
(progn
(ad-set-arg 3 nil)
(setq mew-prog-ssl-arg "sslVersion=TLSv1\n")))
ad-do-it))
</pre>
JRF2019/7/200651
<pre>
(eval-after-load "mew-ssl"
'(ad-activate 'mew-open-ssl-stream))
</pre>
その上で (setq mew-ssl-cert-directory "/フルパス_to/.certs") で指定する。
JRF2019/7/208700
ただ、こんなダーティなことをやるぐらいなら、(setq mew-ssl-verify-level 0) のほうが素直かな…と思う。
JRF2019/7/205554
……。
追記。
上で使っている sslVersion=TLSv1 とかいうのは、今の stunnel では使えなくな(ってい)るらしい。
《stunnel 5.45にしたら動かなくなりました - Google グループ》
https://groups.google.com/d/topic/mew-ja/DDAZa8pMTcg
JRF2019/7/229920
で、昔拾った stunnel 5.40 の Windows 版(tstunnel.exe)だと foreground 等のオプションが使えず、私の Mew 6.7 ではそのままでは使えないらしい。
《Success! Mew 6.6 + stunnel 5.14 on Windows 2015年4月6日 - 新納浩幸のホームページ》
http://nlp.dse.ibaraki.ac.jp/~shinnou/memo/mew6.6-stunnel5.14
JRF2019/7/223526
ただ、Mew 6.8 の mew-ssl.el のソースを読むと、すでに対応はされているようす…。
Google グループの記事では、Cygwin の stunnel で Windows でうまくいってるらしいから、新しい Cygwin の stunnel を使えば良さそうではあるが…。
基本、この「ひとこと」で書いたようなことはすでに解決済みなのだろう。
JRF2019/7/223949
それでも So-net に特殊くさいところは protocol=pop3 がらみだから、もし解決されてなかったら、上の最初のコードで (setq mew-prog-ssl-arg "sslVersion=TLSv1\n") のところを消してどうなるか…といったところ。
JRF2019/7/229055
試すべきだが、私の古い省電力 Windows 7 マシンの Cygwin の stunnel をバージョンアップするか、父から譲り受けた Windows 10 マシンに新しい Emacs と Mew と stunnel を入れてそちらでメールを読むようにするか…。迷うなぁ…。とりあえず私は使えてるし…。
JRF2019/7/229763
……。
……。
追記 (2020年4月16日)。
今、新しいマシンに Cygwin 環境を整えた上([cocolog:91803660])で、Windows 用(not cygwin 用)の Emacs 26.3 + Mew 6.8 に Cygwin の stunnel 5.56 を使っている。
JRF2020/4/165120
これらのバージョンでも、So-net では、pop-ssl-port=995, pop-port=110 であれば動くが、pop-port=995 にすると動かない。どうも stunnel を開くときの config で、protocol=pop3 を指定しているからダメになっているようだ。
よって pop-ssl-port=995 pop-port=995 で使うときは、↓の設定をする必要があった。
JRF2020/4/166265
<pre>
(defadvice mew-open-ssl-stream (around mew-open-ssl-stream-pop3-hack)
(let ((mew-prog-ssl-arg mew-prog-ssl-arg))
(if (and (string= (ad-get-arg 3) "pop3")
(string= (ad-get-arg 1) "pop.so-net.ne.jp"))
(ad-set-arg 3 nil))
ad-do-it))
</pre>
JRF2020/4/161173
<pre>
(eval-after-load "mew-ssl"
'(ad-activate 'mew-open-ssl-stream))
</pre>
JRF2020/4/162727
この設定に関しては stunnel が Cygwin か非 Cygwin かで差はなく必要なはず。
JRF2020/4/166115
ただし、
<pre>
(setq mew-ssl-verify-level 0)
</pre>
…じゃないとダメだった。expand-file-name に advice したり Windows の tstunnel を使ったり、いろいろしたが level 2 はダメだった。
CERT: Pre-verification error: unable to get issuer certificate
…になる。
JRF2020/4/160410
openssl だとエラーが出ないのに…。
JRF2020/4/162283
……。
追記。
level 2 できたできた。
~/.certs に、DigiCert High Assurance EV Root CA の pem がないだけだった。
JRF2020/4/167690
.certs 用の PEM ファイルの取って来かたは、Firefox だと、digicert.com に行って、Firefox のアドレスバーの鍵のアイコンをクリックし、矢印を押して「詳細を表示」して出てくるウィンドウで「証明書」を表示すれば、証明書がダウンロードできるページが現れる。
JRF2020/4/167324
そこで、「digicert.com」「DigiCert SHA2 Extended Validation Server CA」「DigiCert High Assurance EV Root CA」の三つから選べる。そこのダウンロードの PEM(cert) と PEM(chain) をそれぞれダウンロードする。三つのをダウンロードすると同じファイル名になるが、それぞれ内容が違うので、それぞれを ~/.cert に登録する。
JRF2020/4/162436
openssl を使って ~/.certs に登録する方法は、Mew のマニュアルの SSL を使うところに書いてある。
JRF2020/4/169945
*Mew debug* には、DigiCert SHA2 Extended Validation Server CA の名が出て来たから、それだけが必要かと勘違いしてた。
JRF2020/4/165391
……。
Windows の tstunnel を使うなら、(setq mew-ssl-unixlike nil) した上で、mew-ssl-cert-directory を Windows 上の ~/.certs のフルパスにすればいい。あとは、2020年4月16日に追記した elisp コードを使えばいい。
Cygwin の stunnel を使うには、やはり、config の CApath に与えるのに c: からはじまるパスだとエラーが出るので、↓のような expand-file-name のハックが必要。
JRF2020/4/164031
<pre>
(defadvice mew-open-ssl-stream (around mew-open-ssl-stream-pop3-hack)
(let ((mew-prog-ssl-arg mew-prog-ssl-arg)
(expand-file-name (lambda (x) x)))
(if (and (string= (ad-get-arg 3) "pop3")
(string= (ad-get-arg 1) "pop.so-net.ne.jp"))
(ad-set-arg 3 nil))
ad-do-it))
</pre>
JRF2020/4/162360
<pre>
(eval-after-load "mew-ssl"
'(ad-activate 'mew-open-ssl-stream))
</pre>
JRF2020/4/167790
mew-ssl-cert-directory には Cygwin 上でのフルパスを指定すること。
JRF2020/4/167982
So-net がメールを受信するときの POP の APOP を廃止し、SSL (TLS)を使うことを強制しようとしている。これは、もう前からなんだけど、つい最近、その期日が迫っているというので焦って設定を見直した。
2017年2月ごろにも案内があって、そのとき試した結果として、メール送信の SMTP を SSL に載せることは成功したが、受信の POP を SSL 化することはできなかった。これが謎であった。
JRF2019/7/193847