してみるテストロゴ
Apache 2.4系でHTTP/2サーバを構築してみるテスト。

ACMEv2を使って、ワイルドカード証明書を取得してみる。

2018年3月14日に、Let's EncryptはACMEv2プロトコルと同プロトコルを使用したワイルドカード証明書の発行を開始しました。

今回はACMEエージェントとして、もっとも対応環境が多いと思われるacme.shを使って説明します。

acme.shのインストールは以下を参考に済ませておいてください。

既にacme.shのインストールが済んでいる方も、最新版にアップグレードします。

# cd ~root/.acme.sh
# ./acme.sh --upgrade

この時、.acme.shフォルダ配下の、dnsapiが初期化される可能性があります。

もし、本サイトで配布しているフックスクリプト(dns_nsd_lv2.sh)が消されてしまったら、以下のとおり、インストールしなおしてください。

 

ワイルドカードの証明書の取得には、dns-01認証チャレンジが必要になります。

ACMEエージェントにWebrootを設定してWebサーバ経由で認証(http-01認証チャレンジ)しても発行されません。

そのため、クラウド環境のDNSサーバを利用している方は、 acme.shを--dnsオプション付で証明書が取れるようにしておいてください。

自前でDNSサーバを立てている人は、nsdを使って,dns-01認証チャレンジが成功するように、以下のページを参考に済ませておいてください。

本ページでは、下記リンクにあるとおり、--dnsオプションに本サイトで配布しているフックスクリプト(dns_nsd_lv2.sh)を例に進めます。

ワイルドカード証明書の取得

2018年3月15日追記:

acme.shのv2.7.8から、アスタリスク(*)だけのドメイン名だけでも発行できるようになりました。

# cd ~root/.acme.sh
# ./acme.sh --upgrade
# ./acme.sh --version
https://github.com/Neilpang/acme.sh
v2.7.8

と出ればOKです。

ここでは、ドメイン名として、example.comを例にします。

example.comの第2階層自身と、第3階層の全てのFQDNに対する証明書を取ってみます。

つまり、1枚でオールマイティーに使える証明書を作ってみます。

□コモンネーム(common name) *.example.com

□X508v3 SAN(Subject Alternative Name) *.example.com example.com

ということで、上記要件をコマンドラインで表現すると、以下のようになります。

# ./acme.sh --issue --dns dns_nsd_lv2 --dnssleep 1 -d "*.example.com" -d "example.com"

ここで、重要なのが、-dオプションの後ろのドメイン名、特にアスタリスク(*)を含むものには、ダブルクオーテーションで括ってください。

実行すると以下のようになります。(~root/.acme.shにacme.shがインストールされている想定です。)

# cd ~root/.acme.sh
# ./acme.sh --issue --dns dns_nsd_lv2 --dnssleep 1 -d "*.example.com" -d "example.com"
[2018年 3月14日 水曜日 XX時XX分XX秒 JST] Multi domain='DNS:*.example.com,DNS:example.com'
[2018年 3月14日 水曜日 XX時XX分XX秒 JST] Getting domain auth token for each domain
[2018年 3月14日 水曜日 XX時XX分XX秒 JST] Getting webroot for domain='*.example.com'
[2018年 3月14日 水曜日 XX時XX分XX秒 JST] Getting webroot for domain='example.com'
[2018年 3月14日 水曜日 XX時XX分XX秒 JST] Found domain api file: /root/.acme.sh/dnsapi/dns_nsd_lv2.sh
[2018年 3月14日 水曜日 XX時XX分XX秒 JST] Using nsd
[2018年 3月14日 水曜日 XX時XX分XX秒 JST] Sleep 1 seconds for the txt records to take effect
[2018年 3月14日 水曜日 XX時XX分XX秒 JST] Verifying:*.example.com
[2018年 3月14日 水曜日 XX時XX分XX秒 JST] Success
[2018年 3月14日 水曜日 XX時XX分XX秒 JST] Removing DNS records.
[2018年 3月14日 水曜日 XX時XX分XX秒 JST] Using nsd
[2018年 3月14日 水曜日 XX時XX分XX秒 JST] Verify finished, start to sign.
[2018年 3月14日 水曜日 XX時XX分XX秒 JST] Cert success.
-----BEGIN CERTIFICATE-----
(・・・省略・・・)
-----END CERTIFICATE-----
[2018年 3月14日 水曜日 XX時XX分XX秒 JST] Your cert is in  /root/.acme.sh//*.example.com/*.example.com.cer
[2018年 3月14日 水曜日 XX時XX分XX秒 JST] Your cert key is in  /root/.acme.sh//*.example.com/*.example.com.key
[2018年 3月14日 水曜日 XX時XX分XX秒 JST] The intermediate CA cert is in  /root/.acme.sh//*.example.com/ca.cer
[2018年 3月14日 水曜日 XX時XX分XX秒 JST] And the full chain certs is there:  /root/.acme.sh//*.example.com/fullchain.cer

また上記例のように、複数のFQDNを-dオプションで指定しているときに、Common Name(CN)にワイルドカードを含む証明書がほしいときは、-dオプションで指定するドメイン名のうち、先頭にアスタリスク付きのドメイン名を指定します。

なお、この場合、.acme.shフォルダ配下の、秘密鍵、証明書などが配置されるフォルダ名にアスタリスクが含まれます。

そのため、フォルダ名を指定する場合は、\マークでエスケープする必要があります。

ワイルドカード証明書の確認

念のため、ワイルドカード証明書の中身を確認します。


# cd ~root/.acme.sh
# cd \*.example.com
# ls

*.example.com.cer *.example.com.csr *.example.com.key fullchain.cer
*.example.com.conf *.example.com.csr.conf ca.cer

ぜんぶアスタリスク付きのファイル名なのでなんとなく違和感ありますが、OpenSSLで確認してみます。

# openssl x509 -in \*.example.com.cer -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            XX:XX:XX:XX
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3
        Validity
            Not Before: Mar 14 XX:XX:XX 2018 GMT
            Not After : Jun 12 XX:XX:XX 2018 GMT
        Subject: CN=*.example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
					(・・・省略・・・)
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage:
                TLS Web Server Authentication, TLS Web Client Authentication
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Subject Key Identifier:
                (・・・省略・・・)
            X509v3 Authority Key Identifier:
                (・・・省略・・・)

            Authority Information Access:
                OCSP - URI:http://ocsp.int-x3.letsencrypt.org
                CA Issuers - URI:http://cert.int-x3.letsencrypt.org/

            X509v3 Subject Alternative Name:
                DNS:*.example.com, DNS:example.com
            X509v3 Certificate Policies:
                Policy: 2.23.140.1.2.1
                Policy: 1.3.6.1.4.1.44947.1.1.1
                  CPS: http://cps.letsencrypt.org
                  User Notice:
                    Explicit Text: This Certificate may only be relied upon by Relying Parties and only in accordance with the Certificate Policy found at https://letsencrypt.org/repository/

    Signature Algorithm: sha256WithRSAEncryption
			(・・・省略・・・)
-----BEGIN CERTIFICATE-----
			(・・・省略・・・)
-----END CERTIFICATE-----

ちゃんとCNが、*.example.com(実際は皆さんのドメイン名)になっていればOKです。

Let's EncryptのACMEv2の発行制限について

既存の発行制限に加えて、Let's EncryptのACMEv2では、新たに発行制限が追加されています。

具体的には、アカウント当たり、3時間に300件の新規発行依頼を超えた場合に、証明書の発行が制限されます。

 

まとめると、

●ひとつのIPv4アドレスからは、 3時間あたり最大10個のアカウントが作成できます。

●IPv6では、 プリフィックス/ 48のIPレンジごとに、3時間あたり最大500のアカウントを作成できます。

●ドメインごとの証明書発行数(週あたり20件)

●重複した証明書の上限は週5枚

●ACMEv2は、アカウント当たり、3時間に300件の新規発行依頼まで[New!]

となります。

数字としては、手動で操作していたらこの制限に引っかかることはないと思います。

システム化したりすると、制限に引っかかることもあるかもしれません。

NEXT >> Let's Encryptの機能のまとめ

©Copyrights 2015-2018, non-standard programmer

このサイトは、あくまでも私の個人的体験を、綴ったものです。 軽く参考程度にご利用ください。