Appearance
同步签发证书
POST
/openapi/v3/sync-orders/{product_id}
创建订单并等待证书签发。请求体复用创建订单的请求模型;进入本接口即表示请求同步签发。
本接口默认等待预算约 45 秒,也可通过 sync_timeout_seconds 设置本次等待时间。证书在等待窗口内签发、证书链可安全读取,并且电子签名证书完成托管时,返回 HTTP 200;已创建订单但仍在处理时,返回 HTTP 202。等待结束不会取消已提交的订单。
alternative_order_id 是订单请求身份
alternative_order_id 在本接口中必填,并在当前账户范围内标识同一次下单意图。首次请求成功创建订单后,服务端持久保存 alternative_order_id 到订单 ID 的映射。相同 ID 命中已有映射时,服务端直接复用并等待原订单,不会重新创建或扣费,也不会再使用本次请求中的 product_id 或其它业务字段进行判定。
服务端不会比较重试请求体。调用方必须使用相同 alternative_order_id 重放原始业务参数;产品、主体、有效期或其它下单意图发生变化时,必须使用新的 ID。仅调整本次等待参数 sync_timeout_seconds 不需要更换 ID。
备用 ID 按原始字符串匹配,首尾空格不会自动移除;例如 "ext-1" 与 " ext-1 " 是不同的 ID。请在首次提交前确定最终取值,重试时不要再进行去空格等转换。
复用订单仍需具备原订单的访问权限,包括其所属项目的权限;仅属于同一账户并不代表有权读取其他项目的订单或证书。
请求
Path 参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| product_id | string | 是 | 要下单的产品 ID。可通过产品列表或产品详情接口确认账户可见产品及其同步签发能力。 |
Body 参数 application/json
请求字段和校验规则与异步创建订单的 Body 参数相同,但有以下附加约束:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| alternative_order_id | string | 是 | 当前账户范围内本次下单意图的稳定请求身份。不能为空或全为空白,重试时须保持原串。 |
| sync_timeout_seconds | integer | 否 | 本次同步等待时间,单位为秒。省略或 0 使用默认配置;显式值允许 1~120。不改变订单或证书的有效期。 |
| certificate.csr_from | string | 是 | 第一阶段必须为 esign,表示使用托管私钥的电子签名证书交付流程。 |
| certificate.chain_id / certificate.cross_chain | integer | 否 | 首次创建的含义与取值见创建订单参数。 相同备用 ID 重试使用已保存的订单偏好,不通过重试请求切换证书链;签发后可用设置订单交付偏好调整路径。 |
| person_info.id / organization.id | string | 按产品要求 | 引用当前账户下已经审核通过、仍然有效且满足产品要求的个人或组织主体。 |
| esign_sign_task_id | string | 命中审核链接预授权时必填 | 调用方生成的稳定签署任务 ID。首次请求和同参重试必须保持一致。 |
请求体最大为 1 MiB。超过限制或 JSON 无法按创建订单模型解析时,返回 HTTP 400 invalid_parameters。
等待时间
sync_timeout_seconds | 行为 |
|---|---|
省略或 0 | 使用默认配置,请求预算约 45 秒,包含响应处理预留时间。 |
1~120 的整数 | 按指定秒数等待,接口另预留约 1 秒用于响应处理;完成后即可返回,不必等满预算。 |
负数、大于 120、小数或字符串 | 返回 HTTP 400 invalid_parameters。重试已有订单时也会校验此参数。 |
该参数仅作用于本次调用,不会保存到订单。重试同一备用 ID 时可设置不同的等待时间;已有订单仍按原业务参数处理。该参数仅用于同步签发接口,不用于切换创建订单接口的行为。
等待预算不是签发时效承诺
等待时间不保证证书在指定秒数内签发,也不是 HTTP 请求总耗时的严格上限。数据读取、结果处理和网络传输可能延长响应;客户端或网关也可能因更短的超时设置提前断开。
客户端与网关超时应覆盖所选等待时间、响应处理及网络余量。如果发生网络超时、断连或 HTTP 500/503,不能据此判断订单未创建,也不能保证收到 HTTP 202。请保留原备用 ID,按异常后的重试规则处理。
第一阶段支持范围
第一阶段只支持 TrustCenter 的托管型电子签名认证证书。新订单至少需要同时满足:
- 产品类型为 TrustCenter ESign,并属于当前实现支持的个人或组织审核类型。
certificate.csr_from为esign,主体已启用 CA 私钥托管;USB Token 等非托管交付方式不支持。- 请求引用的个人或组织主体属于当前账户,审核已完成并通过,审核类型与产品匹配,且审核材料在要求的有效期内。
- 按创建订单的
user_agreement约定接受产品用户协议;产品配置了协议时,显式传false返回user_agreement_not_accepted。 - 证书申请所需的个人、组织、联系人或法人字段完整。
- 审核信息未被一次性消耗规则判定为不可复用。
- 订单不需要管理员人工审批或商务确认,也不处于等待支付状态。
电子签名认证证书不使用域名验证,因此域名和 DCV 不属于本期同步资格条件。资格检查只能排除已知的前置阻塞,不能保证 CA 签发和证书托管一定在本次等待窗口内完成。
审核通过的主体会直接用于订单,不会因其来自审核链接而重新创建待审核主体。组织还需满足所选产品的审核类型、审核有效期,以及经办人或法人的对应验证要求;仅看到组织已通过某一种审核,不代表满足所有产品的申请条件。
审核链接预授权下单
创建审核链接时开启预授权后,终端用户在审核页面确认授权次数、有效期、协议和可选 PIN。审核通过后,本接口使用审核链接详情返回的 person_info.id 或 organization.id 查找对应授权记录;组织订单无需重复提交审核链接中的联系人信息。
命中开启预授权的记录时,CertCloud 在订单创建前同步调用云签 A1.1 获取 CSR 和签名授权 Token:
- 请求必须提供稳定的
alternative_order_id和esign_sign_task_id。 - A1.1 成功后,响应的
data.esign_sign_grant_token可能随 HTTP 200 或 HTTP 202 返回。未命中预授权的兼容流程仍可正常创建订单,但不会返回该字段。 - Token 只通过创建订单响应交付,订单详情不返回 Token,也无法通过普通订单查询接口补查。收到后应按敏感凭据保护,不得写入日志、URL、浏览器本地存储或普通业务埋点。
- 如果响应丢失,使用相同
alternative_order_id、esign_sign_task_id和原始业务参数重试本接口。服务端会恢复原订单和 Token,不要生成新的签署任务 ID。
失败与重试边界
云签明确失败且订单尚未提交 CA 时,审核授权会释放,可在修正问题后重新下单。云签请求结果未知时不会释放授权,只能使用相同请求参数重试;修改主体、签署任务 ID、订单有效期或其他业务参数会返回请求冲突。
请求示例
以下个人、机构示例均使用 esign 托管、RSA 2048 位密钥、SHA256 和 12 个月有效期,未传 sync_timeout_seconds,因此采用默认等待配置。
认证信息通过环境变量 CC_AUTH_KEY、CC_KEY_ID 传入。姓名、组织名称、主体 ID、终端用户标识和备用订单 ID 均为示例值,调用前须替换为当前账户的实际信息。其中 person_info.id / organization.id 必须引用已审核通过且满足产品要求的主体;user_external_id 应保持为终端用户在您平台中的稳定唯一标识。
个人高等级证书
产品 ID 为 trustasia_ide_pipc,通过 person_info.id 引用已审核的个人主体。
bash
: "${CC_AUTH_KEY:?set CC_AUTH_KEY}"
: "${CC_KEY_ID:?set CC_KEY_ID}"
curl --max-time 65 -i \
-X POST 'https://api.certcloud.cn/openapi/v3/sync-orders/trustasia_ide_pipc' \
-H 'Content-Type: application/json' \
-H "X-CC-Auth-Key: ${CC_AUTH_KEY}" \
-H "X-CC-Key-ID: ${CC_KEY_ID}" \
-d '{
"certificate": {
"common_name": "张三",
"csr_from": "esign",
"sign_hash": "SHA256",
"key_algo": "RSA",
"key_len": 2048
},
"validity_months": 12,
"user_agreement": true,
"user_external_id": "customer-person-001",
"alternative_order_id": "sync-person-20260831-0001",
"esign_sign_task_id": "sign-task-person-0001",
"person_info": {
"id": "123456"
}
}'机构高等级证书
产品 ID 为 trustasia_ide_bipro,通过 organization.id 引用已审核的组织主体。与个人示例相比,此处不传 person_info。
bash
: "${CC_AUTH_KEY:?set CC_AUTH_KEY}"
: "${CC_KEY_ID:?set CC_KEY_ID}"
curl --max-time 65 -i \
-X POST 'https://api.certcloud.cn/openapi/v3/sync-orders/trustasia_ide_bipro' \
-H 'Content-Type: application/json' \
-H "X-CC-Auth-Key: ${CC_AUTH_KEY}" \
-H "X-CC-Key-ID: ${CC_KEY_ID}" \
-d '{
"certificate": {
"common_name": "示例科技有限公司ERP",
"csr_from": "esign",
"sign_hash": "SHA256",
"key_algo": "RSA",
"key_len": 2048
},
"validity_months": 12,
"user_agreement": true,
"user_external_id": "customer-org-001",
"alternative_order_id": "sync-org-20260831-0001",
"esign_sign_task_id": "sign-task-org-0001",
"organization": {
"id": "org_example_001"
}
}'以上展示的是等待期间已完成交付的响应。若仍在处理,按HTTP 202 与重试规则处理;若需要自定义本次等待时间,在请求顶层添加 sync_timeout_seconds,示例如下。
多语言调用(自定义等待)
以下示例使用已经审核通过的个人信息 ID,将本次等待时间设为 30 秒,客户端超时设为 65 秒以预留响应和网络时间。product_id、认证信息和 person_info.id 请替换为当前账户的实际值。省略 sync_timeout_seconds 即使用默认配置;提高等待时间时,也应相应调整客户端和网关超时。
bash
: "${PRODUCT_ID:?set PRODUCT_ID to a TrustCenter ESign product ID}"
: "${CC_AUTH_KEY:?set CC_AUTH_KEY}"
: "${CC_KEY_ID:?set CC_KEY_ID}"
curl --max-time 65 -i \
-X POST "https://api.certcloud.cn/openapi/v3/sync-orders/${PRODUCT_ID}" \
-H 'Content-Type: application/json' \
-H "X-CC-Auth-Key: ${CC_AUTH_KEY}" \
-H "X-CC-Key-ID: ${CC_KEY_ID}" \
-d '{
"certificate": {
"csr_from": "esign"
},
"validity_months": 12,
"person_info": {
"id": "123456"
},
"alternative_order_id": "sync-esign-20260826-0001",
"sync_timeout_seconds": 30,
"user_agreement": true
}'同步交付成功
只有以下条件全部满足时才返回 HTTP 200:
- 订单及主 CA 订单均已签发。
- 叶证书可以安全读取,且证书归属和完整性检查通过。
- 中间证书链可以安全构建。
- 对
csr_from=esign的电子签名证书,私钥托管已经完成。
只完成 CA 签发不等于同步交付成功。证书尚未托管时仍返回 HTTP 202;托管进入明确失败终态时返回 sync_issuance_hosting_failed,不返回证书 PEM。
HTTP 200 data
| 字段 | 类型 | 说明 |
|---|---|---|
| id | string | 订单 ID。 |
| status | string | 原订单状态,参见订单状态。 |
| alternative_order_id | string | 本次查找并绑定订单的备用订单 ID。 |
| certificate.id | string | 证书 ID。 |
| certificate.pem | string | 仅一张叶证书 PEM。 |
| certificate.ica_pem | string | 一张或多张中间证书的 PEM 拼接,按叶证书签发者向上排列;所选证书链包含交叉签名证书时一并返回。 |
| organization | object | 新建请求产生组织信息时可能返回;当前同步响应仅包含 organization.id。复用已有订单时可能省略。 |
| dcv_val | array[object] | 新建请求产生域名验证值时可能返回;本期 ESign 订单不使用 DCV,复用已有订单时也可能省略。 |
| esign_sign_grant_token | string | 仅审核链接预授权 A1.1 成功时返回的敏感签名授权 Token;HTTP 200 或 202 均可能携带。 |
证书响应安全边界
- 响应不包含根证书。
certificate.pem只包含叶证书,不会混入中间证书。certificate.ica_pem不包含叶证书、根证书或非证书 PEM block。- 响应不包含私钥、加密私钥、密码提示、PIN、CSR、密钥证明或其它 enrollment 输入。
esign_sign_grant_token不会写入订单详情或后续回调;若创建响应丢失,只能通过同参重试创建接口恢复。
ica_pem 是当前选定的一条证书链,不是所有可选链的集合。请解析其中全部 CERTIFICATE 块并保留顺序,不要只取第一张;交叉签名证书可能使用含有“Root”的名称,但并不因此等同于被排除的自签名根证书。
处理中与重试
HTTP 202 表示已经存在可恢复的持久订单,但尚未完成同步交付。等待预算耗尽或已有订单无法继续占用等待容量时均可能返回 202,因此它不表示每次都等满了预算,也不表示创建失败。
响应头固定包含:
http
Retry-After: 3客户端至少等待 3 秒,然后使用相同 alternative_order_id、相同 product_id 和原始业务参数重放同一个 POST。审核链接预授权订单还必须保持相同 esign_sign_task_id。可以调整 sync_timeout_seconds。订单完成后返回 HTTP 200;仍在处理时继续返回 HTTP 202;未支付、业务终态或证书交付故障则返回对应错误。
certificate.id 在已分配时为非空值;客户端应以 HTTP 状态判断同步交付是否完成,不能仅凭订单 status 或证书 ID 判断。订单可能已经显示 issued,但电子签名证书仍在等待托管,此时仍返回 HTTP 202。
使用同一请求重试后成功
下面保留首次请求的业务参数和 alternative_order_id,仅将本次等待时间改为 90 秒,并将客户端超时调至 110 秒:
bash
curl --max-time 110 -i \
-X POST "https://api.certcloud.cn/openapi/v3/sync-orders/${PRODUCT_ID}" \
-H 'Content-Type: application/json' \
-H "X-CC-Auth-Key: ${CC_AUTH_KEY}" \
-H "X-CC-Key-ID: ${CC_KEY_ID}" \
-d '{
"certificate": {"csr_from": "esign"},
"validity_months": 12,
"person_info": {"id": "123456"},
"alternative_order_id": "sync-esign-20260826-0001",
"esign_sign_task_id": "sign-task-person-0001",
"sync_timeout_seconds": 90,
"user_agreement": true
}'订单完成后,服务端返回同一个订单 ID 的 HTTP 200 响应及叶证书和中间证书链,不需要客户端自行创建第二张订单:
http
HTTP/1.1 200 OK
Content-Type: application/json
{
"data": {
"id": "ord_sync_7K2m9Q",
"status": "issued",
"alternative_order_id": "sync-esign-20260826-0001",
"certificate": {
"id": "cert_4nP8xR",
"pem": "-----BEGIN CERTIFICATE-----\nMIIB...leaf-only...\n-----END CERTIFICATE-----\n",
"ica_pem": "-----BEGIN CERTIFICATE-----\nMIIC...intermediate-issuer...\n-----END CERTIFICATE-----\n"
}
},
"code": "success"
}未收到确定结果时
- 网络超时、断连或 HTTP 500/503 不代表订单未创建。退避后保留同一备用 ID 和原始业务参数重试;若已绑定订单,接口仍返回原订单结果。
- 收到错误
data.id时,保留该订单 ID 供查询或人工排查。不要因错误响应缺少证书 PEM 就更换备用 ID 重新下单。 sync_issuance_payment_required表示订单仍未支付;持续未支付时需要人工处理,本接口不会自动补支付。sync_issuance_certificate_delivery_failed表示证书无法安全交付;持续出现时请提供订单 ID 联系服务支持,不要无限轮询或重复建单。- 订单或托管已进入明确失败终态时,应按错误原因处理,而不是继续等待其自动签发。
容量行为
同步创建和等待受实例及账户容量保护:
alternative_order_id已映射到持久订单时,即使同步等待容量已满,服务端仍读取该订单的当前结果:已完成返回 HTTP 200,已进入终态返回对应终态错误,仍在处理返回 HTTP 202。- 只有尚未绑定订单的新
alternative_order_id在创建或等待容量已满时返回 HTTP 429sync_issuance_waiter_capacity,且不会创建订单。 - 同一个备用 ID 的首次并发创建尚未产生持久映射时,可能返回 HTTP 409
sync_issuance_alternative_id_processing。稍后仍应使用原请求重试。
错误响应
同步签发错误使用现有 envelope:
json
{
"code": "sync_issuance_product_not_enabled",
"error": "产品未开启同步签发"
}完整编号、HTTP 状态和语义见错误码说明。
产品未启用同步签发
已有订单仍未支付
相同备用 ID 命中 unpaid 订单时,返回 HTTP 422 sync_issuance_payment_required 和原订单信息,不会一直返回 HTTP 202,也不会自动重新扣费或补支付。
unpaid 可能是首次支付尚在进行,也可能是支付失败,并不等于已经确认扣款失败。后续查询以最新订单状态为准;支付失败或持续未支付的订单需人工处理,不应更换备用 ID 再次创建。
新备用订单 ID 遇到容量上限
证书交付完整性故障
证书已经签发,但证书、证书链的归属或完整性校验失败时,返回 HTTP 500。暂时读取失败可在等待期间继续尝试;等待结束后仍无法安全交付时,同样返回 HTTP 500 sync_issuance_certificate_delivery_failed,不会一直作为 HTTP 202 处理。
当错误发生在持久订单创建以后,错误 data 可以包含订单 ID、状态、alternative_order_id 和 certificate.id,但不会包含 certificate.pem 或 certificate.ica_pem。
服务暂不可用时可能返回 HTTP 503,其它内部故障可能返回 HTTP 500。响应使用公开错误码,不暴露内部或上游原始错误文本。
错误重用 alternative_order_id
下面两次请求错误地复用了同一个备用订单 ID:
首次请求使用 product-A 和个人主体 123456:
json
{
"certificate": {"csr_from": "esign"},
"person_info": {"id": "123456"},
"validity_months": 12,
"alternative_order_id": "sync-esign-fixed-id"
}错误的后续请求改用 product-B 和个人主体 654321,但仍使用原备用订单 ID:
json
{
"certificate": {"csr_from": "esign"},
"person_info": {"id": "654321"},
"validity_months": 24,
"alternative_order_id": "sync-esign-fixed-id"
}第二次请求不会按新产品、新主体或新有效期创建订单。服务端仍返回第一次请求绑定的订单,例如:
json
{
"data": {
"id": "order-bound-by-first-request",
"status": "issuing",
"alternative_order_id": "sync-esign-fixed-id",
"certificate": {"id": "cert-from-first-request"}
},
"code": "success"
}取消订单后的兼容性例外
最终实现保留了既有取消流程:订单成功取消时,系统会改写原备用 ID 映射以释放该 ID。因此取消后再次使用原 alternative_order_id,可能创建新订单,而不是恢复已取消订单。取消后的新下单意图必须使用新的 alternative_order_id,不要依赖释放后的旧 ID。
