Bring Your Own KMS
Bring Your Own KMS
BYOK (Bring Your Own Key) lets you use your own AWS KMS key for Verbitas signing operations. Your private key never leaves your AWS account. Verbitas’s signer service uses your key via an IAM role you grant access to.
BYOK requires the Enterprise BYOK plan. Contact [email protected] to enable it.
How BYOK works
In the standard configuration, Verbitas manages the signing key in its own AWS KMS account (eu-central-1). With BYOK:
- You create an asymmetric KMS key in your AWS account.
- You grant Verbitas’s signer IAM role
kms:Signandkms:GetPublicKeyon that key. - You configure your recipe with
kms_mode: byokand provide the key ARN. - All subsequent sign calls using that recipe use your key.
Your key is used only for its intended cryptographic operation: signing canonical C2PA claim digests. The signer validates the digest structure before calling KMS. It is not a generic signing oracle.
Step 1: Create an asymmetric KMS key
In your AWS account:
aws kms create-key \ --key-usage SIGN_VERIFY \ --key-spec ECC_NIST_P256 \ --description "Verbitas BYOK signing key" \ --region eu-central-1Note the KeyArn from the output:
arn:aws:kms:eu-central-1:123456789012:key/mrk-1234abcd...For multi-region key resilience, use --multi-region to create an MRK.
Step 2: Grant Verbitas signer role access
Get the Verbitas signer IAM role ARN from the admin console at https://verbitas.io/admin/settings/byok.
Create a KMS key policy granting the signer role access:
{ "Sid": "AllowVerbitasSigner", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::VERBITAS_AWS_ACCOUNT:role/verbitas-signer-prod" }, "Action": [ "kms:Sign", "kms:GetPublicKey" ], "Resource": "*"}Apply the policy:
aws kms put-key-policy \ --key-id arn:aws:kms:eu-central-1:123456789012:key/mrk-1234abcd... \ --policy-name default \ --policy file://key-policy.json \ --region eu-central-1Grant only kms:Sign and kms:GetPublicKey. Do not grant kms:GenerateDataKey, kms:Decrypt, or any other permission.
Step 3: Register the key ARN in Verbitas
curl -X POST https://api.verbitas.io/v1/keys \ -H "Authorization: Bearer $VERBITAS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "type": "byok_aws_kms", "key_arn": "arn:aws:kms:eu-central-1:123456789012:key/mrk-1234abcd...", "description": "My BYOK signing key" }'Response:
{ "key_id": "vbk_01j...", "type": "byok_aws_kms", "key_arn": "arn:aws:kms:eu-central-1:123456789012:key/mrk-1234abcd...", "status": "validating"}Verbitas calls kms:GetPublicKey to verify the grant works. The status changes to active within a few seconds.
Step 4: Create a recipe with kms_mode byok
id: my-byok-recipe-v1version: 1extends: enterprise-strict-v1@1media_type: imagedescription: Enterprise signing with BYOK KMSc2pa: enabled: true assertions: [ai_generated, generator, model, created_at, legal_entity]watermark: enabled: true engine: trustmarksoft_binding: enabled: true methods: [exact_watermark, perceptual_hash]anchoring: enabled: true methods: [opentimestamps, arbitrum]kms_mode: byokretention: manifest_days: 2555billing: meter: image_sign unit: assetcurl -X POST https://api.verbitas.io/v1/recipes \ -H "Authorization: Bearer $VERBITAS_API_KEY" \ -H "Content-Type: application/yaml" \ --data-binary @my-byok-recipe-v1.yamlStep 5: Sign with your BYOK recipe
result = client.sign( "document.jpg", recipe="my-byok-recipe-v1", metadata={"legal_entity": "ACME Corp", "generator": "my-pipeline"})print(result.verifier_url)The C2PA manifest will contain the X.509 certificate from your KMS key. Verifiers see your organisation’s certificate.
Key rotation
When you rotate your KMS key, Verbitas automatically picks up the new key version. KMS key versioning is transparent to the signer. No action is required in Verbitas.
To use a completely different key ARN, register the new ARN via POST /v1/keys and update your recipe. Existing assets signed with the old key continue to verify against that key version.
Revoking access
To revoke Verbitas’s access, remove the key policy statement granting the signer role access. New sign calls using the BYOK recipe will fail with 503 verbitas.signer.unavailable.
Existing manifests remain verifiable. The signature is stored in the manifest and does not require re-contacting KMS to verify.
To deactivate a BYOK key in Verbitas without removing the AWS policy:
curl -X POST https://api.verbitas.io/v1/keys/vbk_01j.../deactivate \ -H "Authorization: Bearer $VERBITAS_API_KEY"Security constraints
apps/signeris the only Verbitas service that calls AWS KMS. No other service has AWS credentials.- The signer validates the digest is a canonical C2PA claim hash (32 bytes, correct structure) before calling KMS.
- Your key policy is a customer-controlled layer on top of Verbitas’s own IAM policy.
Audit
All BYOK sign operations are recorded in the Verbitas audit log. AWS CloudTrail also logs every kms:Sign call made by the Verbitas signer role on your key.