ConoHa VPSのKUSANAGIにワイルドカードSSL証明書を設定

ConoHa VPSのKUSANAGIにワイルドカードSSL証明書を設定した手順とつまづいたポイントについて。 基本的には下記記事にしたがって設定しました。

以下、上記記事に沿って補足する形で記述していきます。

certbotのインストールは省略

下記コマンドを試して、バージョンが出てくるか確認。出てきたらインストール済なので省略。

$ certbot --version

ConoHa VPSのDNSにはAレコードで_acme-challengeを設定できない

Conoha DNS設定にて「_acme-challenge」をAレコードでIPアドレスに向ける。

と紹介されていますが、現在ではConoHaのDNSに上記の設定をしようとすると「予期せぬエラーが発生しました。お問い合わせください」とエラー表示となります。

この点、ConoHaにメールで問い合わせてみたところ、下記回答を得られました。

お問い合わせの件につきまして、ConoHaのDNSの仕様上 名称(ホスト名)に[_]を含む文字列は登録ができかねるものと なっております。

ConoHa DNSの仕様により、Aレコードに _ を含む文字列が登録できないようになっているようです。後述しますが、TXTレコードには _acme-challengeとして _ を含む文字列を登録できたので、上記仕様はAレコード等のレコード種別に適用される仕様なのでしょう。

そこで、Aレコードを変更するDNS設定は省略して作業を続けます。実際に進めたところAレコードに _acme-challengeを登録する作業は不要で、後に説明するTXTレコードにのみ登録することで問題なくワイルドカードSSL証明書の取得と設定を行うことができました。

Aレコードでワイルドカード設定を行うときはCNAMEレコードはすべて空にする

上記に関連して、Aレコードにワイルドカードを設定するためには、CNAMEレコードを空にする必要があります。

ConoHaの仕様上、該当のドメインに何らかのCNAMEレコードが設定されている場合には、Aレコードにワイルドカード(*)を設定できないようになっているようです。

一旦、

CNAMEを全て消去 → Aレコードにワイルドカードを設定 → CNAMEにレコードを再設定

というようにしてください。

CNAMEの正確な動作は保証できませんが、恐らくAレコードのワイルドカードよりもCNAMEに設定した値が優先されます。(すべてのレコード値が別名で書き換えられるため)

let's encryptのコマンドを実行してからDNSにTXTレコードを追記

image

certbotコマンドに—manualオプションをつけ、ワイルドカードSSL証明書を取得

下記コマンドを実行。

$ certbot certonly --manual \
    --preferred-challenges dns-01 \
    --server https://acme-v02.api.letsencrypt.org/directory \
    -m [あなたのEmailアドレス] \
    -d [あなたのドメイン名] \
    -d *.[あなたのドメイン名]

kusanagi ConoHa環境でサブドメインを含むワイルドカードSSL証明書を取得・自動更新する方法 | Will feel Tips

—preferred-challangesオプションでdns-01によるチャレンジをつけないと、HTTP-01によるチャレンジとなってしまい、HTTP-01による認証方法ではワイルドカード証明書は取得できません。

また、 2つ目の-dオプションでワイルドカード.ドメインのように指定しないと、ルートドメインのみ適用となり、ワイルドカードSSL証明書とはならないので注意。

あとは対話式で設定先ドメイン名を聞かれるので、答えていきます。

DNSのTXTレコードにワンタイムトークンを設置

すると下記の表示が。

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

<text-token>

Before continuing, verify the record is deployed.

<text-token>の場所に表示された文字列を、DNSのTXTレコードの値に追加します。TXTレコードの名称は_acme-challengeにします。

DNSレコード変更は、各地のDNSサーバーに認識されるのに時間がかかるので、少し待ちます。(数分〜20分程度)

TXTレコードが反映されているかどうかは、新規ターミナルから下記コマンドを実行することで調べられます。

$ dig -t txt _acme-challenge.yourdomain.com @8.8.8.8

上記で返ってくる ANSWER SECTIONに、DNS上のTXTレコードに設定したワンタイムトークンが返ってきたらチャレンジを進めてOK。

または、下記DNSチェックツールなどでもTXTレコードの内容が反映されているか確認できます。

DNSへのTXTレコード反映を確認したら、ターミナルでEnterしてチャレンジを実行。

なお、チャレンジに失敗した場合、再度発行されるトークン文字列は異なるものが発行されます。(ワンタイムトークン)

そのため、チャレンジに失敗した場合は新たに発行されたトークンの文字列でDNSのTXTレコードを書き換えてください。

残りは参考記事のとおりに進める。NginxのSSL設定ファイル変更

残りはkusanagi ConoHa環境でサブドメインを含むワイルドカードSSL証明書を取得・自動更新する方法 | Will feel Tips の記事のとおりに進めてください。

ただし、cert:に記述する鍵のパスは

/etc/letsencrypt/live/example.com/fullchain.pem

が正しいのでご注意。(リンク先の記事に一部誤りあり)

私の場合だと、vimで /etc/nginx/conf.d/[your-profile]_ssl.conf の内容を下記のように編集します。

  1 #=======================================
  2 # test-again.site SSL
  3 #---------------------------------------
  4 
  5 server {
  6     listen       443 ssl http2;
  7     server_name  your.siteurl www.your.siteurl;
  8 
			# 9行目と10行目を編集
  9     ssl_certificate      /etc/letsencrypt/live/[your.siteurl]/fullchain.pem;
 10     ssl_certificate_key  /etc/letsencrypt/live/[your.siteurl]/privkey.pem;
 11     ssl_dhparam /etc/kusanagi.d/ssl/dhparam.key;

このあたりは先程certbotコマンド成功時にでてきたimportantの内容にパスが記述してありましたね。

Nginx設定ファイルの変更が完了したら、Nginxを再起動して反映させます。

$ nginx -t  # Nginxの設定が正しく通っているかチェック
$ nginx -s reload 
$ kusanagi restart

cronでcertbotを実行させ、SSL証明書を自動更新

その他追加で設定したこと: 常時SSL化

KUSANAGIでは、下記コマンドでかんたんに常時SSL化の設定を行うことができます。

$ kusanagi ssl --https redirect <プロファイル名>

なお、プロファイル名は下記コマンドで確認できます。

$ kusanagi status

参考: HTTP-01チャレンジでワンタイムトークンが書き込めないとき

下記コマンドでlet's encryptを実行。HTTP-01によるチャレンジを行います。

$ certbot certonly --manual

あとは対話式で設定先ドメイン名、登録メールアドレスを聞かれるので、答えていきます。

進めていくと

Create a file containing just this data:

9Fx.... (テキスト文字列)

And make it available on your web server at this URL:

http://yourdomain.com/.well-known/acme-challenge/9Fxk...文字列

のように表示されます。これは、「HTTP-01チャレンジ」と呼ばれる行為。

/etc/nginx/conf.d/_http.confに、下記設定を追加します。

location ^~ /.well-known/acme-challenge/ {
     default_type "text/plain";
}

下記コマンドでNginxの設定が正しいか確認できます。

$ nginx -t