らっちゃいブログ

日々の学びと気づきを発信するブログ

【Nginx】ガラケーからSSL接続できなくて原因を調べたときの話

経緯

ガラケーからアクセスすると

「ユーザ証明書がありません」

の表示が出てアクセスできない、というユーザーからの問い合わせで発覚。

調査

まず設定内容を確認。

ガラケーとそれ以外でドメイン分けて名前ベースのバーチャルホストを切り、それぞれ異なる証明書を設定してました。

わざわざバーチャルホストを切ったのは、メインの証明書はワイルドカード証明書になっていて、ガラケーはそれに対応できないため。めんどくさいですよね。

次に状況を確認。手元にガラケーがないので Mac でアクセスしてみると、問題なくアクセスできてました。ひとまず証明書の期限が切れているわけではなさそう。

サーバー側にクロスルート証明書を仕込み忘れてたのかな?と思いきや、確認してみるとちゃんと入ってました。さすが自分。

となると、サーバー側の設定に問題はないように見える。こうなるとクライアント側の問題なのだろう。

そう思ってルート証明書が入ってないのか等々ガラケーについて調べていたところ、近くにいる人がたまたま docomoガラケー持っていたので、試させてもらうことができました。

すると「このサイトは安全でない可能性があるため接続できません」というエラーが。

これは何かおかしいと思い、サーバー側に tcpdump を仕込んでSSL通信を確認したところ、なんとガラケー用ではないワイルドカードの証明書が渡されているではないですか。なんてこったい。

ひとまずこれでサーバー側の設定がおかしいことが確定しました。

きっと正しいバーチャルホストへアクセスが行っていなそうだったので、ガラケー側バーチャルホストにだけデバッグログを仕込んでみると、正しくアクセスが来ている。うーん、しかしなんでか SSL のログが少ないような・・・

!!!

ここで閃きました。SSL だけバーチャルホストの設定が効いていないように見える。つまり、SSLだけが別バーチャルホスト(デフォルト設定)で動作している!

ここまでくるともうほぼ原因が見えていて、SNI が効いていない説が濃厚でした。なにしろガラケーは SNI に対応していないんですよね。すっかり忘れておりました。

というわけで、ガラケー用にIPを増やしてバーチャルホスト設定をIPベースにしてみたところ正しく動作するようになりました。(さらっと書いたけどこの作業が一番しんどかった)

ひとこと

運用が大変なので、ガラケー使ってる人はスマートフォンに変えてください!