🧵
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 Write(SSL および証明書 編集)の権限を付与したトークンであれば、それぞれの API エンドポイントに共通で利用することができます。
確認場所

トークンの作成
ユーザーまたはアカウントのトークンを作ります。
どちらかでカスタムトークンを作成し、SSL and Certificates の Write を付与します。
ユーザー 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