OpenSSL のバージョンアップによる handshake problemserror:00000000:lib(0):func(0):reason(0)

問題1

セキュリティアップデートサービス付きのサーバで OpenSSL のバージョンアップ(0.9.8m->1.0.0a)が行われた後、Perl プログラムから Basic認証付きのSSLサイトにアクセスできなくなった(LWP モジュール使用)。

エラーメッセージは下記の通り。

500 Can’t connect to <SITENAME> (SSL connect attempt failed because of handshake problemserror:00000000:lib(0):func(0):reason(0))

対応

SSL関連のPerlモジュールが原因と予想は付いたが、CPANコンソール(perl -MCPAN -e shell)から upgrade や force upgrade をしても問題が解決しなかった。

手動でPerlモジュール Crypt::SSLeay 0.58を再インストールしたところ、この問題は解消。
なお、Crypt::SSLeay の再インストール時には、openssl のどのバージョンを使うか(別のパスにインストールされていた)を確認された。

CPANコンソールだとこれを勝手に決めるか、古いものを保存しているためにうまくいかなかったのかもしれない。(調査していない。)

問題2

さて上の問題を解消したら、今度はエラーメッセージが以下の様に変わった。

500 SSL negotiation failed: error:1406D0B8:SSL routines:GET_SERVER_HELLO:no cipher list

ふう。

Apache の mod_ssl も新しいバージョンの OpenSSL でアップデートされていたので、元の http.conf だと設定に不足があるらしい。

対応

httpd.conf の中で共通に1か所指定すればよいと思っていた以下の暗号化方式リストを、各VirtualHost の設定コンテクストの中にコピー。

SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

以上でめでたく問題解消。

他の問題:Opera

上記の問題の発生と前後してブラウザ Opera のアップデート(->10.63)を行ったら、問題の出ていたサイトに「セキュア処理を完了することができません」というエラーが出た。

同じApacheで運営している別のSSLサイト(個別の証明書あり)にはアクセスできるので、当該 VirtualHostの証明書(ドメイン共通証明書)との相性か、まだ httpd.conf の設定が悪いか何かで証明証を受け入れてくれないらしい。

ふう。