For the complete documentation index, see llms.txt. This page is also available as Markdown.

Certificates

Certificates are used to establish trust between parties in OID4VCI and OID4VP flows. They are included in the x5c header of issued credentials and presentation requests, allowing verifiers and wallets to validate the certificate chain back to a trusted root.

SVX Wallet supports multiple key types, but the two most relevant for certificate-backed trust are:

  • Credential key – used to sign credentials (for example mso_mdoc Document Signing Certificate, DSC).

  • Presentation request key – used to sign presentation requests by the verifier, establishing verifier identity.

The typical setup flow is:

  1. Create a root CA locally.

  2. Create a Certificate Signing Request (CSR) via the SVX Wallet API.

  3. Sign the CSR with your root CA using openssl.

  4. Import the signed certificate back into the SVX Wallet API.

  5. Optionally import trust anchor certificates for external chain validation.

Who can undertake this operation?

Certificate management can only be performed by people who have access to the SVX Wallet Dashboard and API.

Create a Root CA

Before creating CSRs, you need a root CA to sign leaf certificates. The following examples create a self-signed root CA for credential signing (IACA) and a separate root for presentation request signing.

# Create a root CA for credential signing (IACA)
openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -nodes \
  -x509 -sha256 -days 1825 \
  -keyout meeco_iaca.key \
  -out meeco_iaca.cer \
  -subj "/C=AU/O=Meeco/CN=Meeco IACA" \
  -addext "basicConstraints=critical,CA:true,pathlen:0" \
  -addext "keyUsage=critical,keyCertSign,cRLSign" \
  -addext "subjectKeyIdentifier=hash" \
  -addext "subjectAltName=URI:<issuer_uri>"

# Create a root CA for presentation request signing
openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -nodes \
  -x509 -sha256 -days 1825 \
  -keyout meeco_reader_root.key \
  -out meeco_reader_root.cer \
  -subj "/C=AU/O=Meeco/CN=Meeco" \
  -addext "basicConstraints=critical,CA:true,pathlen:0" \
  -addext "keyUsage=critical,keyCertSign,cRLSign" \
  -addext "subjectKeyIdentifier=hash" \
  -addext "subjectAltName=URI:<issuer_uri>"

Create a CSR

CSRs are created via the SVX Wallet API against a named key. The API returns the CSR PEM for external signing.

Create a CSR for the credential signing key:

Create a CSR for the presentation request signing key:

Sign the CSRs

Use openssl to sign each CSR with the appropriate root CA. Certificate extensions differ depending on the intended key usage.

Save the following extension configuration to a file (e.g. openssl-extensions.ext):

Note: openssl x509 -req does not automatically copy all attributes from the CSR into the signed certificate. Properties such as subjectAltName, keyUsage, and extendedKeyUsage must be explicitly defined in the extension file to ensure they appear correctly in the issued certificate.

Sign the credential CSR (DSC):

Sign the presentation request CSR:

Import Signed Certificates

Once signed, import each leaf certificate the SVX Wallet API. The certificate must be DER-encoded and base64-encoded in the x5c field.

Import Trust Anchor Certificates

Trust anchor certificates allow the wallet to validate incoming certificate chains from external issuers or verifiers.

Import a trust anchor certificate chain:

Remaining endpoints

The following endpoints are used to maintain and read certificate information:

  • GET /system/certificates - List all imported trust anchor certificates.

  • DELETE /system/certificates/{certificate_id} - Delete a trust anchor certificate.

API References

Import certificate

post

Import certificate material in x5c form (DER-encoded, base64-encoded items).

Behavior depends on whether key_name is provided:

  • With key_name: imports a managed certificate for that managed signing key.

    • x5c must contain at least one certificate.

    • The first item (leaf certificate) public key must match the managed key.

    • The full provided chain is stored.

    • fingerprint256 is stored as null.

  • Without key_name: imports a trust_anchor certificate.

    • x5c must contain exactly one certificate.

    • fingerprint256 is computed and stored.

Notes:

  • For mso_mdoc (mDL) credential issuance the credential key must have a valid DSC certificate; issuance will fail without it (see ISO 18013-5 for mDL DSC requirements).

  • When signing CSRs externally (for example with openssl x509 -req), explicitly provide extensions such as subjectAltName, keyUsage, and extendedKeyUsage so they are present in the issued certificate.

Authorizations
AuthorizationstringOptional
Bearer authentication header of the form Bearer <token>.
Body
x5cstring[] · min: 1Required

Certificate chain in DER base64 format.

  • With key_name, provide at least the leaf certificate (full chain is accepted and stored).
  • Without key_name, exactly one certificate is required.
key_namestringOptional

Optional managed signing key name. When present, imports as managed.

Responses
201

Certificate imported

application/json
post/system/certificates/import
201

Certificate imported

List certificates

get

Returns a list of imported certificates and metadata.

Certificates are stored by type:

  • managed: bound to a managed signing key (key_name present), may contain a full x5c chain, and has fingerprint256 = null.

  • trust_anchor: imported without key_name, must contain exactly one certificate in x5c, and has a non-null fingerprint256.

The response includes certificate id, type, associated key_name (when bound), the stored x5c, and fingerprint256 according to the certificate type rules above.

Authorizations
AuthorizationstringOptional
Bearer authentication header of the form Bearer <token>.
Responses
200

Certificates list retrieved

application/json
get/system/certificates
200

Certificates list retrieved

Delete certificate

delete

Delete an imported certificate by identifier.

Removal deletes either:

  • a managed key-bound certificate chain, or

  • a trust entry (trust_anchor).

Removing a credential signing certificate can break mso_mdoc issuance.

Authorizations
AuthorizationstringOptional
Bearer authentication header of the form Bearer <token>.
Path parameters
certificate_idstring · uuidRequired

Certificate ID

Responses
204

Certificate deleted

No content

delete/system/certificates/{certificate_id}
204

Certificate deleted

No content

Last updated