Troubleshoot the private trust stack
Diagnose cross-product authorization, configuration, enrollment, path-validation, and signing failures.
Use this page to diagnose failed runs and requests with uncertain results across DigiCert® Account Manager, DigiCert® Private CA, DigiCert® Device Trust Manager, and DigiCert® Software Trust Manager. Use the private trust stack reference to look up identifiers, authentication methods, and request formats.
For general authentication, authorization, throttling, and server errors, see API error handling and rate limits. Preserve the HTTP status, response body, request ID or correlation ID, endpoint, and timestamp when escalating an API failure. Never include API tokens, passcodes, client private keys, or returned device private keys in a support record.
Quick triage
| Signal | Start here |
|---|---|
403 or client-certificate authentication | Account and identity failures |
| Certificate template eligibility | Cross-product resource failures |
| CA assignment or hierarchy | Private CA failures |
| Division, profile, policy, or group | Device Trust configuration failures |
| Passcode, registration, inventory, or path validation | Device enrollment failures |
| Profile, keypair, signing authentication, trust, or signature | Software Trust failures |
Account and identity failures
A cross-product request returns 403
Authentication succeeded, but the service user lacks a required role or access to a required resource.
Start with the credential’s effective access. GET /account/api/v1/role returns role names without their permissions, so it cannot identify why a request was refused. Retrieve the service user instead:
curl --fail-with-body --silent --show-error \
"https://<host>/account/api/v1/user/${SERVICE_USER_ID}" \
-H "x-api-key: ${BOOTSTRAP_API_TOKEN}" |
jq '[.applications[] | {name, roles, permissions}]'
Compare the assigned roles and returned permission codes against the required capabilities. The product-to-role-key map identifies which key in GET /account/api/v1/role holds candidate roles for the product that refused the request. Keep role names and effective permission codes separate when comparing them.
If a required permission is missing, retrieve the roles for that product, select a role whose display_name and description match the capability, and update the user with PUT /account/api/v1/user/{user_id} if your access policy permits. Prefer replacing the service user over adding a broad administrator role.
If the documented role and permission checks pass, confirm that the CA, template, profile, policy, and division belong to or are shared with the same account_id. If resource scope is also correct, capture the request ID and response body: the operation might require an additional deployment-specific permission or product control.
Client certificate does not authenticate the service user
Confirm all of the following:
- The client certificate was created for the same service user whose API token is in
x-api-key. - The request uses the
clientauth.hostname for the correct tenant region. - The certificate is enabled and within its validity period.
- The private key matches the certificate:
test "$(openssl x509 -in client.crt -pubkey -noout | openssl sha256)" = \
"$(openssl pkey -in client.key -pubout | openssl sha256)"
Cross-product resource failures
Certificate template is rejected
List templates in the product where you create the profile. Do not use GET /certificate-authority/api/v1/template for either profile. Apply the complete checks in Select the device certificate template or Select the code-signing certificate template, including account availability.
Both selection steps report the same error for every failed condition. Identify the failing condition before changing anything. The name parameter on both endpoints matches templates whose name contains the value. A near-miss name therefore returns the record and then fails the exact-name check.
- For Device Trust Manager, drop the
nameparameter and evaluate the conditions one at a time with the listing in If no template is eligible. - For Software Trust Manager, drop the filters when you need to inspect all available categories, then inspect
status,type,template,body.issue_types, andbody.extensions.extended_key_usage.required_usageson each returned record. Only thenamefilter is documented as a contained-string match.
Do not relax the selection criteria. Hosted Software Trust Manager template changes go through DigiCert Support. For Device Trust Manager, an authorized administrator might be able to clone or edit a template; other operations can require system-scoped access. If your deployment has no authorized administrator, contact DigiCert Support or your account representative.
Private CA failures
CA endpoint returns 404
Confirm that the URL includes the DigiCert Private CA base path:
https://<host>/certificate-authority/api/v1
https://<host>/ca is not the endpoint URL documented by the API reference. Template discovery does not use the DigiCert Private CA /template endpoint in this solution.
Issuing CA is not available in another product
Confirm that:
- The selected CA has
status: activeand is an intermediate, not the root. POST /certificate-authority/api/v1/ca/{device_ica_id}/accountsandPOST /certificate-authority/api/v1/ca/{signing_ica_id}/accountsreturned204for newly added assignments.- The CA’s
account_assignmentscontains the target account. device_ica_idis available to the Device Trust Manager division.signing_ica_idis available to the Software Trust Manager account.- Each selected issuing CA can issue end-entity certificates and validates beneath
root-ca.pem.
Device Trust Manager configuration failures
Division creation succeeds but there is no ID
The create response contains status information but not the division ID. Search with GET /devicetrustmanager/api/v4/division?account_id=<id>&name=<name>, then select the exact active name from records. Do not read id directly from the create response.
If creation returns Primary zone ID is required if a secondary zone is present, select an exact enabled rendezvous zone with is_primary_usage: true and send its ID in primary_rzone_id.
Certificate profile returns 400
Check that body is an array of objects containing key, optional, enabled, sources, and value. A value such as "body": ["BODY"] is invalid. The API requires the explicit values for allow_any_key_type, allowed_key_types, the validity duration, and all four renewal settings shown in Create the device certificate profile. Also confirm:
certificate_template_idis the template ID from Device Trust Manager.divisionscontains the intended division ID or the profile is intentionally account-wide.- Each source value is supported by both the API reference and the template.
- Required fields such as the common name can be supplied during enrollment.
Certificate policy rejects the issuing CA or profile
Confirm that the request uses the full nested certificate_policy object and includes name, division_id, certificate_profile_id, ica_id, and certificate_management_methods. The profile must be available to the selected division. Inspect the successful response and require certificate_profile.id and ica.id to match the requested values.
For the SINGLE enrollment method, include the single_cert_request_parameters object from Create the REST certificate policy. The API rejects an otherwise minimal policy with Provide single request parameters. Remove fields copied from response schemas or unrelated API versions, such as digital_signing_ica_id and expired_on. The create response stores the new object in certificate_policy. Read the ID from certificate_policy.id.
Device group rejects the policies array
Each array item must be a policy-assignment object. For example:
{
"policy_id": "IOT_<uuid>",
"assignment_name": "Private device bootstrap certificate",
"type": "bootstrapCertificate",
"auth_policy_id": "<authentication-policy-uuid>",
"status": "ACTIVE"
}
The allowed assignment types are bootstrapCertificate and operationalCertificate.
Device enrollment failures
Passcode is not found
The API reference documents a 404 response when the service cannot find the authentication passcode. Confirm that:
- The request sends
x-passcodeand omitsx-api-key. - The value is the original passcode, not
passcode_hint. - The passcode is active and within its usage limit and validity period.
- The request includes the device group whose policy assignment contains the matching authentication-policy override.
- The certificate policy ID matches the policy in that assignment.
Certificate signing request or private-key fields are missing
The key-generation fields are conditionally required:
- For client-side generation, submit
csrand keepserver_side_key_genfalse or omit it. - For server-side device registration, set
server_side_key_gen: trueand provide the registration endpoint’s uppercasekey_type,key_format, andkey_syntaxvalues. The policy must allow server-side generation.
If the profile requires user-supplied fields, include them in certificate_policies.bootstrap[].attributes as name and value pairs.
Device registration fails or has an uncertain result
Do not automatically repeat POST /devicetrustmanager/api/v4/device/registration. Search the device inventory by the exact unique name and intended group first. If the device exists, registration succeeded even if the client did not retain a successful response.
Confirm that:
- The request uses
/devicetrustmanager/api/v4/device/registration, not the certificate-issuancerequestCertificateendpoint. - The request sends the original passcode in
x-passcodeand omitsx-api-key. - The top level contains
name,account_id,device_group_id, andcertificate_policies. - The bootstrap entry contains the matching certificate policy,
server_side_key_gen: true, and uppercaseRSA_2048,PEM, andPKCS8values. - Required certificate fields use
attributes[].nameandattributes[].value. - The group assignment contains the matching certificate and authentication policy IDs and reports
status: ACTIVE.
If the device exists, query certificate inventory using the account, division, certificate policy, and exact common name. Then require the result’s device.id to match the registered device. Do not use the certificate endpoint’s device_group_id filter for this recovery because it can exclude an otherwise retrievable registered certificate.
If the registration response containing the server-generated private key was lost, inventory recovery cannot prove that the key matched the certificate. Stop the full validation path rather than registering a duplicate. Follow the approved product recovery or cleanup process, or begin a new isolated run with a new name. If no device exists, preserve the request timestamp, endpoint, HTTP status, and response headers before deciding whether a new uniquely named request is safe.
Certificate-path validation fails
Inspect the end-entity issuer and both CA subjects:
openssl x509 -in device.pem -noout -subject -issuer
openssl x509 -in device-issuing-ca.pem -noout -subject -issuer
openssl x509 -in root-ca.pem -noout -subject -issuer
openssl verify -CAfile root-ca.pem -untrusted device-issuing-ca.pem device.pem
Common causes include selecting the wrong issuing CA, using a stale CA download, omitting the intermediate, or trusting the issuing CA instead of the approved root. Compare SHA-256 fingerprints with the records retained when you download and validate the CA certificates.
Software Trust Manager failures
No eligible custom test template is available
Stop before creating a certificate profile or keypair. In hosted Software Trust Manager accounts, DigiCert might control certificate-template administration. Ask DigiCert Support to create or update an active certificate template with type: CUSTOM and template: TEST. The template must require the code-signing EKU and be available to the target account. Do not substitute a SYSTEM or PRODUCTION template for this validation workflow.
Software Trust reports that the account license is not found
Stop the signing workflow and confirm that the target account has an active Software Trust Manager license that permits test-keypair generation, certificate generation, and hash signing. Template visibility and effective permissions such as GENERATE_SM_KEYPAIR and SIGN_SM_HASH do not prove that the product license is enabled for the account.
Treat a license error from keypair creation as an uncertain create result. Follow Recover an uncertain keypair create result and search by the exact unique alias before retrying or creating a replacement. If signing returns the license error, preserve the response and correlation information and stop; no signature is available to verify.
Keypair creation or signing returns an authentication error
Keypair creation and signing require:
https://clientauth.<tenant-host>/signingmanager/...- The service user’s client certificate and matching private key.
- The same service user’s API token in
x-api-key.
Supplying only the certificate or only the API token is insufficient.
Keypair request returns 400
Use a specific algorithm configuration. RSA accepts one of the documented key sizes. ECDSA and EdDSA use a supported curve. Do not send key_size: 0, and do not send both key_size and curve for one keypair.
Product documentation limits TEST keypairs to a maximum of 30 days. The general API schema includes NO_EXPIRY in the enum, but do not request non-expiring behavior for this test workflow. Omit the optional expiry_type as shown in Create a test keypair with both authentication factors, then confirm the returned expiry is finite and no more than 30 days. Alternatively, use a finite expiration that your product and signing policy explicitly approve.
For any non-2xx response, timeout, or lost response, do not assume the keypair was rolled back and do not automatically repeat the POST. Search by the exact retained alias first.
Private trust certificate profile rejects the issuing CA field
Use ca_certificate_profile_request.ca.id for the issuing CA. The request does not accept an ica_id property at any level. Also check signing_ica_id, the organization ID, the Software Trust Manager code-signing template, and the CA_PROFILE type. The required properties are name and profile_type at the top level and certificate_template_id and body inside ca_certificate_profile_request. Send body as an empty array when the profile adds no attribute overrides. If the request is still rejected, capture the request ID and response body and contact DigiCert Support.
Signing certificate is not trusted for code signing
Confirm that the certificate:
- Was issued from the code-signing template rather than the device template.
- Contains the code-signing EKU.
- Chains through
signing_ica_idto the root installed in the verifier’s trust store. - Is active and within its validity period.
Private code-signing certificates are not automatically trusted by operating systems or build verifiers.
Raw-signature verification fails
Verify that the same binary digest sent in hash is used for verification, that the signature string is decoded from Software Trust’s documented default Base64 representation, and that the verification algorithm matches sig_alg. For the manual’s RSA example, use SHA-256 with RSA PKCS#1 v1.5 and the public key from the issued signing certificate. A successful API response alone is not signature verification.