ACMEDNS
apiVersion: cert-manager.io/v1kind: Issuermetadata:name: example-issuerspec:acme:solvers:- dns01:acmeDNS:host: https://acme.example.comaccountSecretRef:name: acme-dnskey: acmedns.json
一般的に、ACMEDNSのクライアントはユーザーに代わって登録を行い、作成する必要があるCNAMEエントリを通知します。cert-managerは非インタラクティブなシステムであるため、これは不可能です。登録は事前に行う必要があり、結果として得られるクレデンシャルJSONはSecret
としてクラスターにアップロードする必要があります。この例では、curl
とAPIエンドポイントを直接使用します。ACMEDNSのセットアップと構成に関する情報は、ACMEDNSプロジェクトページで入手できます。
-
まず、ACMEDNSサーバーに登録します。この例では、
auth.example.com
で実行されています。コマンドはcurl -X POST http://auth.example.com/register登録用の資格情報を含むJSONを返します
{"username": "eabcdb41-d89f-4580-826f-3e62e9755ef2","password": "pbAXVjlIOE01xbut7YnAbkhMQIkcwoHO0ek2j4Q0","fulldomain": "d420c923-bbd7-4056-ab64-c3ca54c9b3cf.auth.example.com","subdomain": "d420c923-bbd7-4056-ab64-c3ca54c9b3cf","allowfrom": []}更新エンドポイントをポッドのIP範囲に制限することを強くお勧めします。これは、次のように登録時に行われます
curl -X POST http://auth.example.com/register \-H "Content-Type: application/json" \--data '{"allowfrom": ["10.244.0.0/16"]}'allowfrom
フィールドをクラスター構成に合わせて更新してください。JSONは次のようになります{"username": "eabcdb41-d89f-4580-826f-3e62e9755ef2","password": "pbAXVjlIOE01xbut7YnAbkhMQIkcwoHO0ek2j4Q0","fulldomain": "d420c923-bbd7-4056-ab64-c3ca54c9b3cf.auth.example.com","subdomain": "d420c923-bbd7-4056-ab64-c3ca54c9b3cf","allowfrom": ["10.244.0.0/16"]} -
このJSONをドメインをキーとするファイルに保存します。必要に応じて、同じ資格情報を使用して複数のドメインを指定できます。この例では、返された資格情報を使用して、
example.com
とexample.org
の所有権を検証できます。{"example.com": {"username": "eabcdb41-d89f-4580-826f-3e62e9755ef2","password": "pbAXVjlIOE01xbut7YnAbkhMQIkcwoHO0ek2j4Q0","fulldomain": "d420c923-bbd7-4056-ab64-c3ca54c9b3cf.auth.example.com","subdomain": "d420c923-bbd7-4056-ab64-c3ca54c9b3cf","allowfrom": ["10.244.0.0/16"]},"example.org": {"username": "eabcdb41-d89f-4580-826f-3e62e9755ef2","password": "pbAXVjlIOE01xbut7YnAbkhMQIkcwoHO0ek2j4Q0","fulldomain": "d420c923-bbd7-4056-ab64-c3ca54c9b3cf.auth.example.com","subdomain": "d420c923-bbd7-4056-ab64-c3ca54c9b3cf","allowfrom": ["10.244.0.0/16"]}} -
次に、チャレンジTXTレコードの場所を検証ツールに伝えるCNAMEレコードでプライマリDNSサーバーを更新します。これは、登録の
fulldomain
フィールドから取得します_acme-challenge.example.com CNAME d420c923-bbd7-4056-ab64-c3ca54c9b3cf.auth.example.com_acme-challenge.example.org CNAME d420c923-bbd7-4056-ab64-c3ca54c9b3cf.auth.example.comレコードの「名前」には常に_acme-challengeサブドメインがあり、レコードの「値」は登録のfulldomainフィールドと完全に一致します。
検証時に、
d420c923-bbd7-4056-ab64-c3ca54c9b3cf.auth.example.com
ドメイン名は、検証トークンに設定されたTXTレコードになります。検証ツールが_acme-challenge.example.com
をクエリすると、このCNAMEレコードによって正しい場所にリダイレクトされます。これにより、example.com
を制御していることが証明されます -
ステップ2で保存したクレデンシャルJSONからシークレットを作成します。このシークレットは、DNS01発行者の設定の
accountSecretRef
フィールドで参照されます。Issuer
を作成する場合、このIssuer
とSecret
は同じ名前空間にある必要があります。ただし、ClusterIssuer
(名前空間がない)の場合、Secret
はcert-managerポッドが実行されている場所と同じ名前空間(デフォルト設定ではcert-manager
)に配置する必要があります。kubectl create secret generic acme-dns --from-file acmedns.json
acme-dns
サーバーの制限事項
acme-dns
サーバーには、既知の制限事項があります。一連の資格情報を3つ以上のドメインで使用すると、cert-managerはDNS01チャレンジの解決に失敗します。
単一の資格情報セットでACMEDNS発行者を構成していて、この資格情報セットの「サブドメイン」がd420c923-bbd7-4056-ab64-c3ca54c9b3cf
であると想像してみてください
kind: Secretmetadata:name: auth-example-comstringData:acmedns.json: |{"example.com": {"username": "eabcdb41-d89f-4580-826f-3e62e9755ef2","password": "pbAXVjlIOE01xbut7YnAbkhMQIkcwoHO0ek2j4Q0","fulldomain": "d420c923-bbd7-4056-ab64-c3ca54c9b3cf.auth.example.com","subdomain": "d420c923-bbd7-4056-ab64-c3ca54c9b3cf","allowfrom": ["10.244.0.0/16"]},}---apiVersion: cert-manager.io/v1kind: Issuermetadata:name: my-acme-dnsspec:acme:solvers:- dns01:acmeDNS:accountSecretRef:name: auth-example-comkey: acmedns.jsonhost: auth.example.com
そして、3つのサブドメインを持つ証明書を作成したいと想像してください
kind: Certificatespec:issuerRef:name: issuer-1dnsNames:- "example.com"- "*.example.com"- "foo.example.com"
cert-managerは、3つ中2つのチャレンジを非決定的な方法でしか解決できません。この制限は、このacme-dnsの問題で言及されている「機能」に由来します。
1つの回避策は、チャレンジしたいドメインごとにacme-dns資格情報を1セット発行することです。各acme-dns「サブドメイン」が最大2つのチャレンジされたドメインしか受け入れられないことに注意してください。たとえば、上記のシークレットは次のようになります
kind: Secretmetadata:name: auth-example-comstringData:acmedns.json: |{"example.com": {"username": "eabcdb41-d89f-4580-826f-3e62e9755ef2","password": "pbAXVjlIOE01xbut7YnAbkhMQIkcwoHO0ek2j4Q0","fulldomain": "d420c923-bbd7-4056-ab64-c3ca54c9b3cf.auth.example.com","subdomain": "d420c923-bbd7-4056-ab64-c3ca54c9b3cf","allowfrom": ["10.244.0.0/16"]},"foo.example.com": {"username": "eabcdb41-d89f-4580-826f-3e62e9755ef2","password": "pbAXVjlIOE01xbut7YnAbkhMQIkcwoHO0ek2j4Q0","fulldomain": "d420c923-bbd7-4056-ab64-c3ca54c9b3cf.auth.example.com","subdomain": "d420c923-bbd7-4056-ab64-c3ca54c9b3cf","allowfrom": ["10.244.0.0/16"]}
この設定では、次のようになります
example.com
と*.example.com
は、acme-dns「サブドメイン」d420c923-bbd7-4056-ab64-c3ca54c9b3cf
に登録されています。foo.example.com
は、acme-dns「サブドメイン」d420c923-bbd7-4056-ab64-c3ca54c9b3cf
に登録されています。
別の回避策は、cert-manager-controller
を実行するときに、--max-concurrent-challenges 2
を使用することです。この設定では、acme-dnsは常にデータベースに2つのTXTレコードしか持たないため、問題が軽減されます。