Google Cloud DNS + Let’s Encrypt でワイルドカード SSL 証明書を取得します。
ワイルドカード SSL 証明書とは、1つの SSL 証明書を、複数のサブドメインで共有できる SSL 証明書です。
例えば、leben.mobi のワイルドワード SSL 証明書を取得した場合、その SSL 証明書は、www.leben.mobi でも使えますし、mail.leben.mobi でも ftp.leben.mobi でも使えます。サブドメインが複数ある場合は、それぞれで1つずつ取得するより、ワイルドカードの1つでいいので管理が楽です。
Contents
バージョン
- CentOS 7
- epel-release 7.9
- nginx 1.12.2-1
- certbot 0.24.0-1
- python2-certbot-dns-google 0.24.0-1
インストール
基本的には、普通に Let’s Encrypt で SSL 証明書を取得する場合と同じです。
今回は、DNS に Google Cloud Platform の Cloud DNS を使用しますので、python2-certbot-dns-google が追加になります。
EPEL リポジトリ
# yum install -y epel-release
必要なパッケージは、すべて EPEL リポジトリにありますので、まずは、EPEL リポジトリをインストールします。
Nginx, Certbot, Certbot dns google
# yum install -y nginx certbot certbot-dns-google
certbot-dns-google 以外は、前回の記事、CentOS 7 Nginx に Let’s Encrypt でサイトを SSL 化して SSL 証明書の自動更新を設定する と同じです。
設定
Nginx
server { listen 80; server_name *.leben.mobi; location ^~ /.well-known/acme-challenge/ { root /var/www/letsencrypt; } location / { return 301 https://$host$request_uri; } } server { listen 443 ssl; server_name *.leben.mobi; access_log /var/log/nginx/leben.mobi_access.log main; error_log /var/log/nginx/leben.mobi_error.log warn; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_certificate /etc/letsencrypt/live/leben.mobi/fullchain.pem; ssl_trusted_certificate /etc/letsencrypt/live/leben.mobi/chain.pem; ssl_certificate_key /etc/letsencrypt/live/leben.mobi/privkey.pem; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_user; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Protocol $scheme; location ^~ /.well-known/acme-challenge/ { root /var/www/letsencrypt; } location / { ... } }
server_name 以外は、前回の記事 CentOS 7 Nginx に Let’s Encrypt でサイトを SSL 化して SSL 証明書の自動更新を設定する と同様です。
server_name は、SSL 証明書に合わせて、ワイルドカードとしています。
Certbot dns goole
Credentials file
# mkdir -p /root/.secrets/certbot # cat << EOF > /root/.secrets/certbot/google.json { "type": "service_account", "project_id": ... "private_key_id": ... "private_key": ... "client_email": ... "client_id": ... "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://accounts.google.com/o/oauth2/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": ... } EOF # chmod 600 /root/.secrets/certbot/google.json
Google Cloud DNS を API 経由で操作するために、認証ファイルをサーバー内に保存します。この認証ファイルは、Google Cloud Platform 上の API Manager で作成します。
ワイルドカード SSL 証明書の取得
certbot certonly
# certbot certonly --dns-google --dns-google-credentials /root/.secrets/certbot/google.json -d *.leben.mobi --server https://acme-v02.api.letsencrypt.org/directory --manual-public-ip-logging-ok -m 'Your E-mail Address' --agree-tos
それでは、ワイルドカード SSL 証明書を発行したいと思います。と言っても、通常の SSL 証明書の発行コマンドと同じで、オプションが少し違うだけです。
注意点としては、ワイルドカード SSL 証明書は、DNS-01 方式という DNS の TXT レコード認証が必要になります。
手動でやる場合は、事前に DNS に TXT レコードを追加しておけばいいのですが、自動更新時にエラーになってしまいます。
なので、ワイルドカード SSL 証明書の場合は、certbot のプラグインとして用意のある GCP や AWS などの DNS サービスを使った方が良いでしょう。
ワイルドカード SSL 証明書自動更新
certbot-renew.timer
# systemctl enable --now certbot-renew.timer
ワイルドカードの自動更新ですが、通常の SSL 証明書更新と同じ、certbot-renew.timer でいいと思います。
ワイルドカードの SSL 証明書の自動更新は、まだ私が経験していないため、このような曖昧な説明になっています。もし間違っていたら、記事を正しい方法で更新したいと思いますので、ご了承ください。
まとめ
Google Cloud DNS + Let’s Encrypt でワイルドカード SSL 証明書を取得しました。
ワイルドカード SSL 証明書は、通常の SSL 証明書取得方法に比べ、DNS の TXT レコード認証が必要になり、更新時もそれが必要になります。
自動更新するためには、少し工夫が必要なので、自前で Bind で運用していた場合に、どう実現するかが気になる所です。