SSL導入で苦労した話

広告

以前に、格安SSLを導入したみたで導入しているのですが、その時に苦労した話です。
何が苦労したのかを書いておこうと思います。

 

◎ 発端

まず、www.rocomotion.netのドメインに導入しました。ここまでは順調でした。
ここで止めておけば良かったのですが、another.rocomotion.netにも導入したくなり、何も考えずに2つ目のSSLを購入しました。
そこで、ハッと思い出しました。
1つのIPに対し1つしかSSLって導入できなかったのでは・・・!?


◎ 通常同一IPでSSLは1つ

調べてみると、、、やはり通常では同一IPでSSLは1つです。
よって、www.rocomotion.netとanother.rocomotion.netの2つの証明書を用意しても同一IPの場合、適用できません。
そういう複数のドメインを使いたい場合は、IPを別とするかマルチドメインの証明書を購入するのが普通です。
マルチドメインとは、*.rocomotion.netの形となり、*部分は何でも良い証明書です。
よって、wwwでもanotherでもその他何でも、この1つの証明書で可能となります。
しかし、値段が高いので、今回は2つ証明書を買ってしまいました。
さて、どうしたものかと困ったときはGoogle先生頼みです。
この時、購入したGoGetSSLの場合、30日返金保証なので、キャンセルするのも一つの方法ではありました。
なので、気軽ではありました。
でも、どうせなら使いたいじゃん(笑)

 

◎ Apacheならできる

調べてみると、Apacheなら、SNI(Server Name Indication)という機能を使えば、同一IPで複数SSLを扱えることがわかりました。

これで導入できると思い、ホッとしたのもつかの間。
SNIを使うには、条件がありました。

 

サーバ側必要条件

  • Apache 2.2.12以降
  • OpenSSL0.9.8f以降

以上の状態でApacheがコンパイルされていること

 

現サーバの状態

  • Apache 2.2.22
  • OpenSSL0.9.8e
 

yumからインストールしているので、これが最新でした。
さてと困りました。
ここで、選択できる方法は3つ。

 
  • SNIを諦める
  • OSをバージョンアップする
  • OpenSSLだけ新しいのを入れてみる
 

◎ OpenSSLの新しいのを入れてみた

ソースからコンパイルして、OpenSSLの新しいバージョンを入れてみました。
OpenSSLのバージョンは上がって、OSからも新しいOpenSSLが使われるようになりました。
しかし、Apacheからは古い方の0.9.8eしか見えません。
「OpenSSL0.9.8f以降でApacheがコンパイルされていること」
これに引っかかったわけですね。

 

ここから選べる方法は3つ。

 
  • SNIを諦める
  • OSをバージョンアップする
  • Apacheをソースからコンパイルする
 

◎ Apacheをソースからコンパイル

OSのバージョンアップは大仕事なので、このタイミングでは避けたかったので、Apacheをソースからコンパイルすることにしました。
いつ以来だろう・・・
yumに頼りきっていたので、コンパイルオプションを何にすれば良いかもすっかり忘れてます。
そこから調査です。
・・・・・・・・・・・・・・・がんばりました。

新しい方のApacheで起動 → ・・・はい、phpが動きません。
新しい方のApache停止、古い方のApache起動して、考えます。

 

◎ もうバタバタ

...きっと、httpd.confのどこかをいじればうまく動きそう
...phpだけyumっていうのも後々困りそう
...phpもコンパイルしよう
...コンパイルオプションわかんねぇ・・・

新しい方のApacheで起動 → ・・・はい、phpの動きがおかしい。
新しい方のApache停止、古い方のApache起動して、考えます。

...何かコンパイルオプション忘れてる
...新旧でphpinfoで比べる
...これか
...もう1回コンパイル

新しい方のApacheで起動 → ・・・はい、phpの動きがおかしい。
新しい方のApache停止、古い方のApache起動して、考えます。

...php.d配下呼ばれてない!?
...コンパイルオプション間違ってないよな・・・
...php.dもういいや。php.iniに全部書く
...もう1回コンパイル

新しい方のApacheで起動 → ・・・はい、やっとまともに動いてるっぽい。
...ログが………シンボリックリンクで対処

・・・・・・・・・・・・・・・がんばりました。

 

◎ やっとSNIの設定をする

ssl.confにSNI関係の記述を追加して、Apache再起動。

https://www.rocomotion.netにアクセス → 問題無く表示
https://another.rocomotion.netにアクセス → 問題無く表示

おぉ、、、両方の証明書がちゃんと表示される。
もう感動。

 

◎ これでも終わらない

サーバ側はうまくいったのですが、クライアント側で対応していないブラウザがあるので、そこの対処が必要。
クライアント側は対応していない場合、証明書のエラーが出るので、その対処をどうするか…
SNIに対応しているブラウザは以下の通り

 
  • Firefox 2.0以降
  • Opera 8.0以降
  • Internet Explorer 7.0以降
  • Google Chrome
  • Safari 3.2.1
  • Android 3.0以降
 

BlackBerryは完全非対応

...考える。

 

◎ .htaccessでリダイレクト

対応しているブラウザをhttpsへ強制リダイレクトしようかと思いましたが、https強制はまだ早いかなと思い、いくつかのブラウザをhttpへリダイレクトするように設定しました。
以下のような感じ。
SNIに対応していても、証明書がごにょごにょのメッセージが出るIEはhttpに飛ばすことにしました。
あと、一部のスマホや古いブラウザは無視していますので完全では無いです。
まぁモダンブラウザは概ね平気なので良いことにしましょう。

 
RewriteEngine on
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_USER_AGENT} "MSIE [5-8]" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Windows\sNT\s5 [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Android.*(Mobile)?\ [0-3] [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^(.*.symbian.*) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^(.*.blackberry.*) [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
 

◎ 完成!!

ここまで、だいたい5日くらいかかりましたが、SNIを諦めることもOSのバージョンアップもせずに何とかなって、とても満足。
久しぶりに大変な思いをした、、、けど楽しかった。

というのが苦労話です。
ずっと楽してちゃダメってことですね。

実はこの後、このブログシステムやRocomotionのシステムのプログラム修正を行って、httpでもhttpsでもちゃんと動くようにして、現在に至ります。

長い道のりでした。

おしまい。

 

○ さくらのVPSでサーバ構築楽しいよ。