NEW: プロジェクトの最新情報を以下で入手TwitterMastodon

ACMEDNS

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: example-issuer
spec:
acme:
solvers:
- dns01:
acmeDNS:
host: https://acme.example.com
accountSecretRef:
name: acme-dns
key: acmedns.json

一般的に、ACMEDNSのクライアントはユーザーに代わって登録を行い、作成する必要があるCNAMEエントリを通知します。cert-managerは非インタラクティブなシステムであるため、これは不可能です。登録は事前に行う必要があり、結果として得られるクレデンシャルJSONはSecretとしてクラスターにアップロードする必要があります。この例では、curlとAPIエンドポイントを直接使用します。ACMEDNSのセットアップと構成に関する情報は、ACMEDNSプロジェクトページで入手できます。

  1. まず、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"]
    }
  2. このJSONをドメインをキーとするファイルに保存します。必要に応じて、同じ資格情報を使用して複数のドメインを指定できます。この例では、返された資格情報を使用して、example.comexample.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"]
    }
    }
  3. 次に、チャレンジ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を制御していることが証明されます

  4. ステップ2で保存したクレデンシャルJSONからシークレットを作成します。このシークレットは、DNS01発行者の設定のaccountSecretRefフィールドで参照されます。Issuerを作成する場合、このIssuerSecretは同じ名前空間にある必要があります。ただし、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: Secret
metadata:
name: auth-example-com
stringData:
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/v1
kind: Issuer
metadata:
name: my-acme-dns
spec:
acme:
solvers:
- dns01:
acmeDNS:
accountSecretRef:
name: auth-example-com
key: acmedns.json
host: auth.example.com

そして、3つのサブドメインを持つ証明書を作成したいと想像してください

kind: Certificate
spec:
issuerRef:
name: issuer-1
dnsNames:
- "example.com"
- "*.example.com"
- "foo.example.com"

cert-managerは、3つ中2つのチャレンジを非決定的な方法でしか解決できません。この制限は、このacme-dnsの問題で言及されている「機能」に由来します。

1つの回避策は、チャレンジしたいドメインごとにacme-dns資格情報を1セット発行することです。各acme-dns「サブドメイン」が最大2つのチャレンジされたドメインしか受け入れられないことに注意してください。たとえば、上記のシークレットは次のようになります

kind: Secret
metadata:
name: auth-example-com
stringData:
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レコードしか持たないため、問題が軽減されます。