無料SSL証明書「Let’s Encrypt」でワイルドカードSSL証明書を適用する

ワイルドカードSSL証明書とは

*.example.com というサブドメインを有するドメインを1つの証明書で運用できます。
* の部分が多くなる想定のドメインにおいて、SSL証明書の取得と維持管理のコストを下げることができます。

※ * は任意の文字列を指定可能。ただしドット(.)を含むことはできない。
※ 証明書の自動更新ができない場合があるのでご注意ください。(後述)

今回適用した環境

less /etc/redhat-release 
CentOS release 6.10 (Final)


以下、すべてのコマンドは root になった状態で発行しています


certbot コマンド

certbot コマンドが入っていなかったので以下の手順にてインストールしました。
すでにインストール済みの場合、このセクションは読み飛ばしてください。

なお、yum でのインストール

# yum install certbot

では、エラーで入らなかったので、pip(pythonのパッケージ管理ツール)にてインストールしました。
※ yumでは下記のエラーで原因は不明。

# yum install certbot

  :

パッケージ certbot は利用できません。
エラー: 何もしません

python36 と python-pip のインストール

# yum install https://repo.ius.io/ius-release-el6.rpm
# yum install python36*
# yum install python-pip

pip の場所を探す

# update db
# locate pip | less
  :
/opt/eff.org/certbot/venv/bin/pip
/opt/eff.org/certbot/venv/bin/pip3
/opt/eff.org/certbot/venv/bin/pip3.4
  :

upgrade pip にてアップグレード

# /opt/eff.org/certbot/venv/bin/pip install --upgrade pip

pip --version にてバージョン確認

# /opt/eff.org/certbot/venv/bin/pip --version
pip 19.1.1 from /opt/eff.org/certbot/venv/lib64/python3.4/site-packages/pip (python 3.4)

pip コマンドで certbot をインストール

# /opt/eff.org/certbot/venv/bin/pip install certbot

certbot の場所を探す

# locate certbot | less
  :
/opt/eff.org/certbot/venv/bin/certbot
  :

certbot を常用コマンドとして登録(シンボリックリンク)

# cd /usr/bin
# ln -s /opt/eff.org/certbot/venv/bin/certbot certbot

which にて確認

# which certbot
/usr/bin/certbot

version 確認

# certbot --version
certbot 1.0.0

certbot コマンドにて、ワイルドカード証明書の取得

# certbot certonly --manual \
--server https://acme-v02.api.letsencrypt.org/directory \
--preferred-challenges dns \
-d *.example.com -d example.com \
-m admin@example.com \
--agree-tos \
--manual-public-ip-logging-ok

※「*.example.com」「example.com」「admin@example.com」は適宜変更


上記コマンドを実行すると、以下のようにDNSのTXTレコードに値(トークン)を設定するように指示されます。
これは、ドメインの正規所有者であるか確認のためです。

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

xxxx-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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


指示されたTXTレコードを設定し、反映されるまで待ちます。
今回は「お名前.com」で管理されているドメインだったため、「お名前.com」の管理画面からTXTレコードを登録しました。

登録後、以下のコマンドにて、TXTレコードが反映されたかを確認します。

# nslookup -type=TXT _acme-challenge.example.com
  :
Non-authoritative answer:
_acme-challenge.example.com	text = "xxxx-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
  :
# dig -t TXT _acme-challenge.example.com
  :
;; ANSWER SECTION:
_acme-challenge.example.com. 41 IN	TXT	"xxxx-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
  :


反映されたらターミナルに戻り、エンターキーを押下して続行します。
(このとき、ドメインの正規所有者であるか認証されます)

Press Enter to Continue
 → 【Enter】キーを押下
なお、エンターキーでの待機状態の時間が経ち過ぎると、認証に失敗するので、その場合はやり直します。
※ 認証失敗に備え、TXTレコードのTTLは短め(60sec位)の設定が推奨されます。


認証に成功すると、以下のように「Congratulations!」と表示され、生成された証明書等のパスが表示されます。

Waiting for verification...
Cleaning up challenges

  :

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem

  :

生成されたファイルの内訳

証明書
/etc/letsencrypt/live/<ドメイン名>/cert.pem

証明書+中間CA証明書
/etc/letsencrypt/live/<ドメイン名>/fullchain.pem

秘密鍵
/etc/letsencrypt/live/<ドメイン名>/privkey.pem

中間CA証明書
/etc/letsencrypt/live/<ドメイン名>/chain.pem

以下、Apache への設定

vhosts.conf(ファイル名は環境によって異なる)の設定

vhosts.conf

<VirtualHost *:443>
    ServerName example.com
    ServerAlias *.example.com

    DocumentRoot /path/to/www/htdocs

      :

    <Directory "/path/to/www/htdocs">

      :

    </Directory>

    # ssl certificate
    SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem

</VirtualHost>

configtest & reload

configtest して、問題なければリロードして反映

# /etc/init.d/httpd configtest
# /etc/init.d/httpd reload

ブラウザからの確認

ブラウザから

https://example.com
https://hoge.example.com
https://fuga.example.com

などにアクセスして、問題がないか確認します。


サブサブドメインについて

sub2.sub1.example.com

のようなホスト名が複数になるサブサブドメインは、今回の取得手順では有効ではありません。

sub2.sub1.example.com

に対して有効にしたい場合は、

sub1.example.com

に対するワイルドカード

*.sub1.example.com

の証明書を取得する必要があります。


証明書の自動更新について

ワイルドカードSSL証明の自動更新については、認証方式に「DNS-01方式」が利用されます。
そのため、API等が用意されている必要があり、以下等でドメイン管理されている必要があります。


それ以外の「お名前.com」や「ValueDomain」の場合は、手動更新しか手段がないようです(2020年8月現在)

なお、Cloudflare と MyDNS については、以下などを参考にしてください。

Cloudflare

MyDNS


関連エントリー: