Download: wine-openssl-force-tlsv1.patch

Downloading: wine-openssl-force-tlsv1.patch Ubuntu 12.04(LTS)で、Evernote(WINE上のWindows版)の同期が失敗(fail)する

Ubuntu 12.04(LTS)を導入したら、EvernoteのWindows版をWINEで導入したものが、同期失敗するという事象に遭遇した人も多いと思う。それどころか、さまざまなアプリケーションで、https通信に失敗した、との問題が報告されている。

ここに報告されているとおりだ。

とりあえず、WINEで使っているアプリが動けばいい、という輩には、このパッチをあてれば、幸せになれるでしょう。
i386のプラットホーム上でおこなってください。amd64の64ビットプラットホームでWINEを使っている方も、i386の32bit上でコンパイル必要です。

$ apt-get source wine1.4
$ cd wine1.4-1.4
$ patch -i ../wine-openssl-force-tlsv1.patch
$ sudo apt-get build-dep wine1.4
$ debuild -us -uc -b -i
$ cd ..
$ dpkg -i *.deb

さて、なにが起こっているかというと、httpsをサポートするインターネット上のサーバには、不都合な挙動をしめすものがある、というのが発端です。

httpsでつかうSSL/TLSのバージョンや暗号化方式のネゴシエーションで、クライアントとサーバ間でそれぞれがサポート可能な方式を交換しあいます。その際に、リストのサイズに問題があります。最近の技術の進展で暗号化方法がふえて、リストが大きくなって来ました。

https://bugs.launchpad.net/ubuntu/+source/openssl/+bug/986147

http://www.mentby.com/Group/openssl-users/sslv23method-in-openssl-100.html


+#ifdef OPENSSL_MAX_TLS1_2_CIPHER_LENGTH
+ /* Some servers hang if client hello > 256 bytes
+ * as hack workaround chop number of supported ciphers
+ * to keep it well below this if we use TLS v1.2
+ */
+ if (TLS1_get_version(s) >= TLS1_2_VERSION
+ && i > OPENSSL_MAX_TLS1_2_CIPHER_LENGTH)
+ i = OPENSSL_MAX_TLS1_2_CIPHER_LENGTH & ~1;
+#endif

そこでTLS V1.2のネゴシエーションで、Cipherの長さを制限しよう、ということになったのです。
ところが、これが曲者で、このワークアラウンドがなければ稼働するサーバで、不都合が発生します。

再現も可能で、

openssl s_client -connect www.evernote.com:443

とすればよい。

さて、私のこのパッチだが、WINEへの改変としては、正しくない、変更を加えている。Windowsの挙動と同じなのが正しいとすれば、違反している。それでも、動作するのだ。どうするかというと、SSLv3, SSLv2, TLSv1のネゴシエーションを行うところを、TLSv1のみでネゴシーエションさせる、という改変をくわえている。これで、不具合が実際上はでないのはなぜかというと、すでにSSLv2はセキュリティ上推奨されていない。最近の稼動しているWebサーバであれば、TLSv1をサポートしていないサーバがありえないし、あるとすればメンテナンスされているかどうか、とても心配なので、そんなサービスをつかわなければいいじゃん、というわけだ。

これでなぜ問題が解決するかというと、ネゴシエーションで交換する暗号化方式が制限されているので、リストの長さ制限に対しても問題がないからだ。

この件は、あまり日本語で情報がないようなので、念の為にかいておく。

OpenSSLのメンテなーとしては、1.0.1-4ubuntu4で、この問題は解決ずみ、という立場のようなのだが、Evernoteは引き続き調子悪いようなので、WINE+opensslの挙動としては、引き続き対応が必要、とおもうのである。