概要

筆者はletsencryptでワイルドカード証明書を取得していますが、

*.example.com

の証明書を取得して、

example.com

の、「サブドメインが付かないドメインそのもの」 (hoge.example.com / foo.example.com / supercalifragilisticexpialidocious.example.com等を 含まない ドメイン)、いわゆるネイキッドドメインでの証明書を取っていないかどうかの確認手順です。

重要な仕様

割と躓きやすい仕様ですが、

*.example.comは、example.comを含みません。

ワイルドカード証明書は「何か」.example.comにマッチする証明書。つまり、この「何か」が空文字にならないルールです。

筆者が過去の記事でletsencryptで証明書を作成する際

certbot certonly --manual \
    --preferred-challenges dns \
    --server https://acme-v02.api.letsencrypt.org/directory \
    -m あなたの有効なメールアドレス@example.com \
    -d "*.example.com" \
    -d "example.com"

と、

  • -d "*.example.com"
  • -d "example.com"

のように、ワイルドカードとネイキッドドメインの両方を含めているのはまさにその理由です。

これを忘れたことによるありがちなエラー

*.example.com だけ取得

https://example.com にアクセス

証明書エラー

「え、ワイルドカードなのに!?」

という事態が多く発生します。

ネイキッドドメインの証明書を取得したか

以下の2つのコマンドを用います。

Let's encryptを利用している場合

非常に簡単です。

sudo certbot certificates

と実行するだけ。

 Certificate Name: example.com
    Serial Number: UID]
    Key Type: ECDSA
    Identifiers: *.example.com example.com

のように、Identifiersの欄に.*がついているとついていないドメインがついていればOKです。

Let's encryptを利用していない場合

openssl x509 -in /path/to/certs/directory/cert.pem -noout -text | grep -A1 "Subject Alternative Name"

と実行。(証明書の場所は合わせます)

X509v3 Subject Alternative Name: 
DNS:*.example.com, DNS:example.com

のように、DNSの欄に.*がついているとついていないドメインがついていればOKです。

以上、実務で予め両方の証明書を取得していれば「なんてことない」仕様ですが、これを取得していない場合のSSL再取得の手間はかなり手間です。