Troubleshoot the private trust stack
Diagnose cross-product authorization, configuration, enrollment, path-validation, and signing failures.
Use this page to diagnose failed runs or requests with uncertain results across DigiCert® Account Manager, DigiCert® Private CA, DigiCert® Device Trust Manager, and DigiCert® Software Trust Manager. Use 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, approval, enrollment, 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. Retrieve the assignable roles again with GET /account/api/v1/role, compare the service user’s current roles, and update it with PUT /account/api/v1/user/{user_id} if your access policy permits. Also confirm that the CA, template, profile, policy, and division belong to or are shared with the same account_id.
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.
- The Device Trust Manager response stores templates in
records. Requirestatus: ACTIVE,type: custom,format: x509,certificate_type: end_entity,body.issue_typescontainingclient_authentication, and a required client authentication extended key usage (EKU). For this manual, also requirersa_2048and a common name that permitsuser_supplied. - The Software Trust Manager response stores templates in
items. Requirestatus: ACTIVE,type: CUSTOM,template: TEST,body.issue_typescontainingcode_signing, andbody.extensions.extended_key_usage.required_usagescontainingcode_signing. - For either product, confirm that the account restrictions permit
account_id.
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 generation, set
server_side_key_gen: trueand provideprivate_key_format. The policy must allow server-side generation. Supplykey_typewhen selecting a non-fixed allowed key type.
If the profile requires user-supplied fields, include them in certificate_profile_attributes.
Enrollment remains pending
If the policy requires approval, PENDING_APPROVAL is not an issued certificate. Poll the request-status endpoint using certificate_request_id. Download the approved certificate only after the status becomes APPROVED.
Enrollment returns an empty 400 response
Stop before retrying. Search for a device and certificate by the exact group, policy, and common name to determine whether the first request created anything. Then confirm that:
- The device profile contains the explicit key, validity, and renewal fields shown in Create the device certificate profile.
- The certificate policy contains
single_cert_request_parametersand the successful create response was parsed fromcertificate_policy. - The group assignment contains the matching certificate and authentication policy IDs and reports
status: ACTIVE. - The request uses the original passcode, includes
device_group_id, setsprivate_key_format: pem, and omitsx-api-key.
If the device and certificate lists contain no match, preserve the request timestamp, endpoint, HTTP status, and response headers and contact DigiCert Support. Do not change fields repeatedly when the response contains no diagnostic information.
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.
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.
Private trust certificate profile rejects the issuing CA field
Use ca_certificate_profile_request.ca.id for the issuing CA. Do not send a top-level ca_certificate_profile_request.ica_id property. Also check signing_ica_id, the organization ID, the Software Trust Manager code-signing template, and the CA_PROFILE type. If the request is rejected, capture the request ID and verify that the API version in your tenant matches the current API reference.
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 response signature is base64-decoded, 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.