ConoHa VPSのKUSANAGIにワイルドカードSSL証明書を設定した手順とつまづいたポイントについて。 基本的には下記記事にしたがって設定しました。
kusanagi ConoHa環境でサブドメインを含むワイルドカードSSL証明書を取得・自動更新する方法 | Will feel Tips
以下、上記記事に沿って補足する形で記述していきます。
certbotのインストールは省略
下記コマンドを試して、バージョンが出てくるか確認。出てきたらインストール済なので省略。
$ certbot --version
ConoHa VPSのDNSにはAレコードで_acme-challengeを設定できない
冒頭で参考記事として紹介した kusanagi ConoHa環境でサブドメインを含むワイルドカードSSL証明書を取得・自動更新する方法 | Will feel Tips の記事では
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レコードを追記
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 Checker - DNS Check Propagation Tool
TXTレコードを選択し、_acme-challange.yourdomain.comで調べられます。
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証明書を自動更新
certbot公式ドキュメントに記述があります。詳細は ConoHa VPSのAPI利用でワイルドカードSSL証明書を自動更新 を参照。
その他追加で設定したこと: 常時SSL化
KUSANAGIでは、下記コマンドでかんたんに常時SSL化の設定を行うことができます。
$ kusanagi ssl --https redirect <プロファイル名>
KUSANAGI の プロファイル設定を確認しLets Encrypt SSL証明書の更新を行う|プログラムメモ
なお、プロファイル名は下記コマンドで確認できます。
$ 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";
}
Let's encrypt で 一時ファイルが作成できない時の対策 - Qiita
無料SSL証明書 Let's EncryptでサーバをHTTPS化する(Nginx + webrootプラグイン利用) - DevCast
下記コマンドでNginxの設定が正しいか確認できます。
$ nginx -t