ワイルドカード可能な無料DNSと無料SSL証明書認証局でサイト構築


イントラネットでOpenShiftを使っていた時は、予めイントラ用DNSに*.(ワイルドカード)を付けたドメイン名のAレコードを登録しておけば、あとはポッドを追加するだけで簡単に各種便利コンテナの恩恵を得ることができた。イントラネットということで割り切ってSSL証明書も使ってなかったしね。

今回、インターネット向けに同様のことがしたいのだが、このご時世、できるだけお金をかけたくない。無料DNSは話は聞いてたけど、Let's Encryptという大変有り難い無料SSL証明書の認証局ということも知ったし。さらにLet's Encryptはワイルドカードなドメイン名にも対応しているから素晴らしい。

で、設定に成功した例は先駆者の方の記事を参考にしてもらうとして、ちょっと嵌ったことを記事にしてみました。

DynuでDNS登録

ワイルドカードが可能な無料DNSを探したところで、ここが見つかった。
画面右上の[Create Account]でアカウントを作成するとコントロールパネルが表示される。

ここで[DDNS Services]をクリックし、

[Add]をクリック。

登録したいドメイン名を指定して[Add]をクリック。
自分はOption1の方で、ワイルドカードなしのホスト名を入力し、適当にトップレベルを選択。

[IPv4 Address]にIPアドレスを入力して[Save]をクリックして完成。

Let's EncryptでSSL証明書作成

ホストのCentOS 7.6にクライアントツールのcertbotをインストール。

$ sudo yum install -y epel-release
$ sudo yum install -y certbot

certbotのバージョンは0.31.0。

で、証明書取得のコマンドを実行。なお、${}は該当する情報に置き換えて。

$ sudo certbot certonly --manual \
    --preferred-challenges dns-01 \
    --server https://acme-v02.api.letsencrypt.org/directory \
    -m ${自分のメールアドレス} \
    -d ${ドメイン名} \
    -d *.${ドメイン名}

...途中省略...

Please deploy a DNS TXT record under the name
_acme-challenge.inet-strange.dynu.net with the following value:

${生成された値}

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

ここでDNSにTXTレコードを作成する必要があるとのこと。DynuはTXTレコードも設定できると聞いてたので、[Manage Dynamic DNS Service]画面にある[DNS Records]をクリックして、[Manage DNS Records]画面の[Type]を[TXT - Text]に変更すると。。。

なんと30日過ぎないとTXTレコードは作成できないとのこと。orz

  • 後日、この制限はアカウントを作成してからの日数ではなく、ドメイン名を登録してからの日数であることも判明。

そこでDNSでの認証が必須なワイルドカードは諦め、certbotコマンドのオプションを、ドメイン名のwebサーバにアクセスできるかで確認する方式(--preferred-challenges http-01)に変更し、-dオプションで思いつく10個ぐらいのサブドメイン名付きで登録することで、対処しました。

そして30日後

めでたくdynuでTXTレコードが設定できるようになり、

certbotでワイルドカードのSSL証明書を作成することができました。

その90日後

こなければいいなと思いつつ、とうとう 「Let's Encrypt certificate expiration notice for domain」のメールが来ました。だいぶ脳内キャッシュから削除された知識を手がかりにして以下のコマンドと、dynuへのTXTレコード設定で更新できました。

# certbot certonly --manual \
 --preferred-challenges dns-01 \
 -d ${ドメイン名} \
 -d *.${ドメイン名}
  • ただ最初は--preferred-challenges dns-01を指定しなで実行したところ、dns-01 と http-01の両方が実行されてしまい、dns-01は成功したのにhttp-01の失敗により証明書が更新されないハメに合いました。
  • 前回、DNSに登録したTXTレコードが反映されるタイミングが判らず、不安になりましたが、今回、nslookup -q=txt _acme-challenge.${ドメイン名}でTXTレコードを確認することを知り、安心して作業できました。