Google Cloud DNS + Let’s Encrypt でワイルドカード SSL 証明書を取得する

シェアする

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つでいいので管理が楽です。

CentOS7 + Apacheの環境にLet’s Encryptをインストールする方法ついて紹介しています。
CentOS7 Nginx に Let's Encrypt でサイトを SSL 化して SSL 証明書の自動更新を設定します。 サイトを SSL 化するのが当たり前の時代になってきました。 Chrome は近い将来、SSL 化していないサイトを閲覧したい際に、アドレスバーで警告を表示するようです。SEO の観点では、検索結果を優遇するという話で、さらに、サイトの高速化にもなるということです。 今年からワイルドカード SSL 証明書の発行も始めました Let's Encrypt。今後、需要はますます高くなっていくでしょう。

バージョン

  • 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 で運用していた場合に、どう実現するかが気になる所です。