エックスサーバー・スターサーバーの無料独自SSL設定をサイト移転前に設定し、SSLで接続できなくなる問題を回避する方法を紹介します。
※スクリーンショットはスターサーバーの管理画面ですが同じ業者であるエックスサーバーでも同様に設定可能です。
サイト公開しないと無料独自 SSL 設定ができない
当ブログはMixHostからスターサーバーへ移転しました。移転時に一番問題だと感じたのが、サイトをスターサーバーで公開しないと無料独自SSL設定ができないため、一定時間SSLが使用できないというダウンタイムが存在してしまうことでした。
スターサーバーにドメイン追加後、SSL設定より「無料独自SSL追加」を行ってもエラーが発生したと表示され設定ができません。
この状態でネームサーバーの設定を変え新サーバーにアクセスが行ってしまうと、SSL検証エラーとなり、SSLを設定するまでの間ダウンタイムとなってしまいます。また、HOSTSファイルを使用して新サーバーでの動作確認も行えません。
SSL 設定時の認証
エックスサーバーやスターサーバーの「無料独自SSL」は「Let's Encrypt Authority X3」を使用しています。認証はLet's Encryptが行っています。
Let's EncryptのWeb認証では、http://example.com/.well-known/acme-challenge/
の直下にLet's Encryptから指示された認証用一時ファイルを設置し、存在が確認されることで行われます。
エックスサーバーやスターサーバーでも「無料独自SSL追加」を行うと設定するサーバーの /.well-known/acme-challenge/
の直下に認証用一時ファイルを設置しています。
移転前動作確認 URL でも認証ファイルにアクセスが可能
認証を通すためにはエックスサーバーやスターサーバーに設置された認証用一時ファイルへアクセスできるようにする必要があります。
エックスサーバーやスターサーバーには「移転前動作確認URL」という機能があり、この機能で作成されたURLでも /.well-known/acme-challenge/
にアクセスが可能になっています。
対処方法
- 「移転前動作確認URL」の設定から動作確認URLを入手します。
-
移転前のサーバーに
/.well-known/acme-challenge/
までのフォルダを作成します。 -
/.well-known/acme-challenge/
の直下に次の.htaccess
ファイルとindex.php
を設置します。
index.php
http://masshiro-blog.check-star.jp/(アクセスされたURL)
にデータを取得しに行き、そのまま返すプログラムです。
URLは /.well-known/acme-challenge/(英数字-_)
以外の場合弾くようにしています。
http://masshiro-blog.check-star.jp/
の部分は移転前動作確認URLに置き換えてください。
<?php
$url = $_SERVER['REQUEST_URI'];
if(preg_match('/^/.well-known/acme-challenge/[a-zd-_]+$/i', $url)):
$cp = curl_init();
curl_setopt($cp, CURLOPT_URL, 'http://masshiro-blog.check-star.jp/' . $url);
curl_setopt($cp, CURLOPT_RETURNTRANSFER, true);
echo curl_exec($cp);
curl_close($cp);
else:
exit();
endif;
?>
.htaccess
WordPressでもお馴染み、直下へのすべてのアクセスを index.php
に転送するプログラムです。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?/$1 [L]
</IfModule>
- SSL設定より「無料独自SSL追加」を行う。
- index.php及び.htaccessを削除する。