稼働中のWebサイトをサーバー移転する際に気にしなければならないのが、SSL証明書の移行について。

例えば「https://example.com」というサイトのサーバーを移転する場合、まず移転先となるサーバーを事前に用意しておかなければならない。

サーバーの用意ができたら、DNSのAレコードを新サーバーに向けることでサイトの移転ができるが、ここで問題となるのがSSLの設定だ。

以前、過去記事でCentOS7におけるLet’s EncryptのSSL設定方法を紹介したが、今回のように別サーバーで稼働中のサイトの場合、こちらの記事で紹介した方法では証明書の取得に失敗することがある。

これは証明書を取得する際の認証で「http」認証をおこなっていることが原因である。

http認証とDNS認証

Let’s EncryptではSSL証明書の取得をする際に、対象のドメインが管理下にあるかの認証をおこなわなければならない。

certbotコマンドの--preferred-challengesオプションで認証方法を選択することができるのだが、ここで「http」認証を選択するとLet’s EncryptはACMEクライアントにトークンを発行し、サーバー上のhttp://${domain}/.well-known/acme-challenge/${token}にACMEクライアントはファイルを設置する。

この時、http認証でエラーが発生する場合は、上記URLにアクセス権限がないケースが考えられる。

適切なアクセス権限を設定することでhttp認証でも証明書の取得ができるのかもしれないが、今回は別途dns認証を選択することで証明書の取得に成功した。

その時使ったコマンドがこちら。

$ certbot certonly \ 
  --manual \ 
  --domain example.com\ 
  --email hoge@example.com \ 
  --agree-tos \ 
  --manual-public-ip-logging-ok \ 
  --preferred-challenges dns

--preferred-challengesオプションにdnsを指定しており、このコマンドを実行すると英語のメッセージがずらずらと表示されて入力待ち状態となる。

内容を確認すると「DNSのTXTレコードに以下の設定を登録しなさい」とあるので、ホスト名を_acme-challenge.example.com、値を表示されたワンタイムトークンに設定したTXTレコードを登録する。

# 表示されるメッセージ一部抜粋

Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:

xxxxxxxxxxワンタイムトークンxxxxxxxxxx

DNSの設定完了後、少し間をあけてからコマンドラインに戻りEnterキーを押すと証明書の取得に成功するはずだ。

証明書を取得できたら以下の記事を参考に、ApacheのSSL設定をおこなえば良い。

これで、稼働中のサイトのDNSを新サーバーに切り替えても事前におこなっておいたSSLの設定が適用され、ダウンタイム無しでサーバー移転をおこなうことができる。