🧵

Cloudflare TLS/SSL エッジ証明書 ”Timed Out Validation”からの再開

に公開

Cloudflare の TLS/SSL エッジ証明書Domain control validation(DCV)で検証でタイムアウト発生(Timed Out Validation)になったときの、検証再開の方法を書いておきます。

API トークンの準備(エッジ証明書管理用)

検証再開に利用する API エンドポイントを操作するため API トークンを作成します。

パーミッションの確認

API ドキュメントで各エンドポイントの Accepted Permissions を確認します。

メソッド パス Docs Unversal/Advanced
get /zones/{zone_id}/ssl/verification API U
patch /zones/{zone_id}/ssl/verification/{certificate_pack_id} API U
get /zones/{zone_id}/ssl/certificate_packs API U,A
patch /zones/{zone_id}/ssl/certificate_packs/{certificate_pack_id} API A

今回のエッジ証明書管理には SSL and Certificates WriteSSL および証明書 編集)の権限を付与したトークンであれば、それぞれの API エンドポイントに共通で利用することができます。

確認場所

トークンの作成

ユーザーまたはアカウントのトークンを作ります。
どちらかでカスタムトークンを作成し、SSL and CertificatesWrite を付与します。

ユーザー API トークン

カスタムトークン

アカウント API トークン

カスタムトークン

Universal Certificate

Universal Certificate の場合です。

証明書の一覧から、検証再開する証明書を特定する

メソッド パス API
get /zones/{zone_id}/ssl/verification API
変数(基本)
export ZONE_ID=<ゾーンID>
export TOKEN=<トークン>
一覧
curl https://api.cloudflare.com/client/v4/zones/$ZONE_ID/ssl/verification \
-H 'Content-Type: application/json' \
-H "authorization: bearer $TOKEN" -s \
| jq '.'
変数(対象 FQDN)
export HOST=<対象ホスト名>
当該 FQDN を抜き出す
curl https://api.cloudflare.com/client/v4/zones/$ZONE_ID/ssl/verification \
-H 'Content-Type: application/json' \
-H "authorization: bearer $TOKEN" -s \
| jq '.result[]|select(.hostname|startswith("'"$HOST"'"))'
出力(validation_timed_out な cert_pack_uuid)
{
  "certificate_status": "validation_timed_out",
  "cert_pack_uuid": "52cbcdaf-3b73-4a58-b11b-d2d0b965f315",
  "validation_method": "http",
  "validation_type": "dv",
  "hostname": "*"
}
cert_pack_uuid だけを得る
jq にフィルターを追加
curl https://api.cloudflare.com/client/v4/zones/$ZONE_ID/ssl/verification \
-H 'Content-Type: application/json' \
-H "authorization: bearer $TOKEN" -s \
| jq -r '.result[]|select(.hostname|startswith("'"$HOST"'"))|.cert_pack_uuid'
出力
52cbcdaf-3b73-4a58-b11b-d2d0b965f315

再開する

メソッド パス API
patch /zones/{zone_id}/ssl/verification/{certificate_pack_id} API
変数(証明書 ID)
export CERTIFICATE_PACK_ID=<cert_pack_uuidの値>
再開(空データの PATCH)
curl https://api.cloudflare.com/client/v4/zones/$ZONE_ID/ssl/verification/$CERTIFICATE_PACK_ID \
-H 'Content-Type: application/json' \
-H "authorization: bearer $TOKEN" -s -XPATCH \
| jq '.'
出力(pending_validation に変わる)
{
  "result": {
    "certificate_status": "pending_validation",
    "cert_pack_uuid": "52cbcdaf-3b73-4a58-b11b-d2d0b965f315",
    "validation_method": "http",
    "validation_type": "dv",
    "verification_info": [
      {
        "status": "pending",
        "http_url": "http://*/.well-known/acme-challenge/Hv*",
        "http_body": "Hv*"
      }
    ],
    "status": "pending_validation",
    "hosts": [
      "*"
    ],
    "hostname": "*"
  },
  "success": true,
  "errors": [],
  "messages": []
}

validation method を変える場合

メソッド パス API
patch /zones/{zone_id}/ssl/verification API
変数
export METHOD=txt
validation method を変える(データで validation_method 指定)
curl https://api.cloudflare.com/client/v4/zones/$ZONE_ID/ssl/verification/$CERTIFICATE_PACK_ID \
-H 'Content-Type: application/json' \
-H "authorization: bearer $TOKEN" -s -XPATCH \
-d '{"validation_method":"'"$METHOD"'"}' \
| jq '.'
出力(validation_method が txt に変わる)
{
  "result": {
    "certificate_status": "pending_validation",
    "cert_pack_uuid": "52cbcdaf-3b73-4a58-b11b-d2d0b965f315",
    "validation_method": "txt",
    "validation_type": "dv",
    "verification_info": [
      {
        "status": "pending",
        "txt_name": "_acme-challenge.*",
        "txt_value": "*"
      }
    ],
    "status": "pending_validation",
    "hosts": [
      "*"
    ],
    "hostname": "*"
  },
  "success": true,
  "errors": [],
  "messages": []
}

Advanced Certificate

Advanced Certificate の場合です。

証明書の一覧から、検証再開する証明書を特定する

メソッド パス API
get /zones/{zone_id}/ssl/certificate_packs API
変数
export ZONE_ID=<ゾーンID>
export TOKEN=<トークン>
export TYPE=advanced
一覧(クエリー status=all + type = advanced)
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/ssl/certificate_packs?status=all" \
-H 'Content-Type: application/json' \
-H "authorization: bearer $TOKEN" -s \
| jq -r '.result[]|select(.type=="'"$TYPE"'")'
変数(対象 FQDN)
export HOST=<対象ホスト名>
当該 FQDN を抜き出す
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/ssl/certificate_packs?status=all" \
-H 'Content-Type: application/json' \
-H "authorization: bearer $TOKEN" -s \
| jq '.result[]|select(.type=="'"$TYPE"'")|select(.hosts[]|contains("'"$HOST"'"))'
出力(validation_timed_out な id)
{
  "id": "8b486eab-b441-4c28-8e55-f9533945ba2b",
  "type": "advanced",
  "hosts": [
    "*",
    "*"
  ],
  "primary_certificate": "0",
  "status": "validation_timed_out",
  "certificates": [],
  "created_on": "2023-09-25T10:55:44.271988Z",
  "validity_days": 90,
  "validation_method": "txt",
  "certificate_authority": "lets_encrypt"
}

再開する

メソッド パス API
patch /zones/{zone_id}/ssl/certificate_packs/{certificate_pack_id} API
変数(証明書 ID)
export CERTIFICATE_PACK_ID=<idの値>
再開(空データの PATCH)
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/ssl/certificate_packs/$CERTIFICATE_PACK_ID" \
-H 'Content-Type: application/json' \
-H "authorization: bearer $TOKEN" -s -XPATCH \
| jq '.'
出力(pending_validation に変わる)
{
  "result": {
    "id": "8b486eab-b441-4c28-8e55-f9533945ba2b",
    "type": "advanced",
    "hosts": [
      "*",
      "*"
    ],
    "primary_certificate": "0",
    "status": "pending_validation",
    "certificates": [],
    "created_on": "2023-09-25T10:55:44.271988Z",
    "validity_days": 90,
    "validation_method": "txt",
    "certificate_authority": "lets_encrypt"
  },
  "success": true,
  "errors": [],
  "messages": []
}
Universal には使えない

この API エンドポイントで Universal も一覧に入ってきますが、PATCH で再開はできませんでした。

メソッド パス API Universal
get /zones/{zone_id}/ssl/certificate_packs API ok
patch /zones/{zone_id}/ssl/certificate_packs/{certificate_pack_id} API fail
{
  "success": false,
  "errors": [
    {
      "code": 1411,
      "message": "ID is not a dedicated or advanced certificate."
    }
  ],
  "messages": [],
  "result": null
}

validation method を変える場合

Universal ssl/verification と違い、 ssl/certificate_packs は PATCH で検証方法を変えることができません(PATCH は検証の再開だけ)。
別の validation method を指定した新しい Advanced Certificate をオーダーします(POST)。
当該の Advanced Certificate は消すことで(DELETE)、無駄な消費を抑制します。

以上

Discussion