さくらのレンタルサーバがあまりよろしくなかったお話


SSLに関してのお話

CloudFlare Logo

CloudFlareという超便利な神サービスが存在しています。
とりあえずCloudFlareの詳細に関しては今回省略しますが、SSL証明書を持っていなくてもSSLが使える…というサービスがあり、それを利用しています。

SSL

自宅のサーバにはStartSSL発行のSSL証明書を導入してあるのでFull SSL (strict)を使用しています。
その他のオレオレ証明書で運用しているサーバはFull SSLだったりFlexible SSLを使用しています。


本題

で、今回はさくらのレンタルサーバの残念仕様についてです。
つい先日、さくらのレンタルサーバのスタンダードプラン等でも独自SSLが使用可能になりました。

 ●独自ドメイン名ごとにSSLサーバ証明書の設定が可能になります
  これまで提供しておりました独自SSL機能では、IPアドレス1つにつき、1つのSSL
  サーバ証明書の設定が可能でした。今回提供開始する「SNI SSL」では、独自ドメ
  イン名ごとにSSLサーバ証明書を設定いただけます。

「さくらのレンタルサーバ」独自SSL機能拡充(SNI SSL提供開始)のお知らせ | さくらインターネット

「やったー!」とか思ったのもつかの間。
CloudFlareのFull SSLを使用しようとしたら問題が発生。
さくらのレンタルサーバの443番ポートは80番ポートへの単なるプロキシでした…
調べた所、わかりづらく記載されていました。

「さくらのレンタルサーバ」にて提供しているウェブサーバApacheは、 80番ポートを使用する(HTTP)ものと、
443番ポートを使用する(HTTPS)ものとの 2種類に分けられます。 また、後者についてはプロクシとして動作します。
一般的に、前者は「http://」、後者は「https://」という形式でアクセスしますが、
同じディレクトリへのアクセスであっても、その際に呼び出されるウェブサーバ が異なると、
CGIプログラムやウェブサーバが.htaccessなどのファイルを読み込む際、挙動に違いが生じます。
例えば、HTTPとしてアクセスした場合はお手元のコンピュータが、 HTTPSとしてアクセスした場合は サーバそのものがアクセス元となります。
このため、SSLのみのアクセス許可(HTTPアクセスの制限)や、mod_rewriteによるURLの書き換えはできません。

SSL利用時の注意点|さくらインターネット公式サポートサイト

このプロキシを通過する際に勝手に追加される HTTP_X_SAKURA_FORWARDED_FORHTTP_X_SAKURA_HTTPS のヘッダを見れば訪問者のIPアドレス等が分かりますが、さくらの仕様を知らないCloudFlareは困ってエラーを吐くという始末です。
なのでCloudFlareを有効にしたまま、hosts辺りで名前解決した際にさくらのレンタルサーバのアドレスを返すようにしておけば以下の通りになります。

  1. クライアントがさくらのレンタルサーバ(https)に対して要求を送信する
  2. さくらのレンタルサーバ(https)の443番ポートは80番ポートへのプロキシなので名前解決を行う
  3. 名前解決した結果、当然CloudFlareのIPアドレスが返ってくるので、そのアドレスを使用しhttpで接続を試みる
  4. CloudFlare(http)はさくらのレンタルサーバ(http)へ接続を試みてコンテンツを取得する

また、hostsを編集せずともcurlで同じことが出来ます。

$ curl -svo /dev/null https://example.com --resolve example.com:443:111.111.111.111 -k

上記は名前解決結果を弄った結果なので、通常は以下の通りになると思います。

  1. クライアントがCloudFlare(https)に対して要求を送信する
  2. CloudFlare(https)がさくらのレンタルサーバ(https)に対して要求を送信する
  3. さくらのレンタルサーバ(https)の443番ポートは80番ポートへのプロキシなので名前解決を行う
  4. 名前解決した結果、当然CloudFlareのIPアドレスが返ってくるので、そのアドレスを使用し接続を試みる
  5. CloudFlare(https)はさくらのレンタルサーバ(https)へ接続を試みてコンテンツを取得する
  6. 2番に戻り無限ループ。 CloudFlareは下記の様なエラーを吐く

Error


まとめ

と、とりあえず言いたいだけ言いましたが、かなり面倒です^q^
SSL鍵の保管とかの関係もあるだろうけれど、かなりつらいのでプロキシとかやめて欲しい。

-> 追記 :: 多分内部で登録されているホスト名を127.0.0.1とかにすればループせずに済みそうだけれども…