Key custody

Bring your own keys, or trust ours — explicitly

Key custody is a deliberate decision, not a buried implementation detail. We default to platform-managed keys for the customers who want simplicity, and we are building a customer-managed pathway (BYO KMS) for the customers whose compliance posture requires that signing material never leave their environment.

Executive summary

Today, document-signing keys are X.509 certificates with private keys encrypted at rest using AES-256-GCM, decrypted only inside the signing path, and never logged. This is the right model for most customers. For customers whose compliance posture requires that signing material never leave their HSM, we are building AWS KMS-backed signing — the private key resides in the customer's KMS, we hold only the key reference, and every signature is an authenticated KMS API call.

Our commitments

Five rules for key custody

01

Plaintext keys never live outside a process boundary

Decryption happens inside the signing path. Keys never reach disk in plaintext, never enter logs, and are explicitly redacted from Inspect and telemetry.

02

Customer-managed keys are a real option, not a footnote

BYO AWS KMS support is in active development. The KMS key ID is the only thing we store; signing is a KMS API call, and the customer can revoke our access at any moment.

03

Key rotation is auditable and non-disruptive

Old documents remain verifiable with the certificate that signed them. New documents use the new certificate. We never re-sign retroactively.

04

Certificate lifecycle is auditable

Upload, activate, and internal revocation events are recorded as hash-chained audit entries. The audit trail is the source of truth for certificate status.

05

Customer-uploaded certificates are honored as-is

A cert from your own CA is signed by your CA — we do not re-issue or re-sign. Your trust chain remains intact and independent of EngineeringID.

Implementation — platform-managed keys (default)

How keys are stored today

Key type X.509 certificate RFC 5280
Key algorithm RSA-4096 default 2048 / 3072 / 4096 supported
Private key storage AES-256-GCM at rest Field-level encryption with redact: true
Wrap key Out-of-database secret Hosted in Fly secrets / AWS KMS depending on environment
Decryption window Single signing call Plaintext exists in memory only for the duration of the signature operation
Logging Forbidden redact: true on schema; explicit guards in inspect implementations
Bring your own cert Supported today Upload a CA-issued cert; private key encrypted before storage
Rotation New cert = new version Old documents verify against the cert that signed them; never retroactive

The full picture

What is built, what is being built, and what we chose not to build

Live today

Field-level AES-256-GCM private key encryption

Live

Signing certificates carry encrypted private keys; decryption happens inside the signing path only.

Bring-your-own-certificate

Live

Customers can upload a cert from their own CA; we never see the source of trust, only the cert itself.

Audit-logged certificate rotation

Live

Every cert lifecycle event (upload, activate, revoke) is a hash-chained audit event with actor and timestamp.

Building now

AWS KMS-backed signing (BYO KMS)

Building now

Customer-managed signing keys resident in the customer's AWS KMS. We hold only the key ID; signing is an authenticated KMS API call. The customer revokes our access by removing the IAM grant.

KMS provider records, AWS SigV4 client, and signer module are scaffolded. Production launch pending end-to-end audit and customer onboarding pilot.

Per-organization key isolation

Building now

Org-scoped boundaries for field-level encryption so a compromise in one tenant cannot decrypt another.

Roadmap

Azure Key Vault and Google Cloud KMS

Roadmap

Same pattern as AWS KMS: customer-resident keys with API-only access. Following AWS KMS once that is GA.

Post-quantum signing keys

Roadmap

CRYSTALS-Dilithium primitives are compiled into our Rust NIF. Production signing callers and schema columns are not yet wired.

Considered & rejected

Holding plaintext private keys for convenience

Considered & rejected

Convenience is not a security argument. Encrypted-at-rest private keys are non-negotiable.

Why we rejected it: caching the plaintext for performance is a way to keep the key in memory longer than the signing operation that needed it. The right answer is: decrypt, sign, drop. The performance cost is one symmetric decryption per signature. We pay it.

Self-managed CA for customer signing certificates

Considered & rejected

A CA only EngineeringID trusts is no better than self-signed.

Why we rejected it: customers who want CA-issued signing material should use their existing CA — DigiCert, Sectigo, or a private CA they control. Us spinning up our own intermediate CA is a trust-multiplication problem we should not take on.

Key escrow for regulatory compliance

Considered & rejected

Escrow is a key-disclosure mechanism, not a regulatory requirement. We are not building one.

Why we rejected it: regulators ask for audit trails and revocation, not for the private key. Escrow creates a single point that, once compromised, gives every signature ever made. Our customers' obligation to regulators is met by the audit chain and the revocation surface, not by handing keys over.

Auto-rotating signing certs without customer involvement

Considered & rejected

A signing key is a legal identity. Rotating it without explicit customer action is a property change we have no business making.

Why we rejected it: data encryption keys can rotate silently because the wrapped data does not care which key wrapped it. Signing keys are different — they are tied to the engineer's professional identity and to the seals already in the world. Rotation is a deliberate act, audit-logged, with customer approval.

Compliance mappings

Controls this surface satisfies

SOC 2 CC6.7

Data Transmission and Disposal

Cryptographic erasure on key destruction

ISO 27001 A.10.1.2

Key management

Lifecycle: generation, storage, rotation, archival, destruction

NIST SP 800-57 Part 1

Recommendations for Key Management

Algorithm choice and key sizes per Table 2

HIPAA §164.312(a)(2)(iv)

Encryption and Decryption

Encrypted-at-rest signing keys with field-level wrap

For compliance teams

Questions you do not need to call to ask

Where exactly are private keys stored today?
Encrypted at rest in the database with AES-256-GCM. The wrap key lives in the host secret store (Fly secrets in production), not the database. A database compromise alone does not yield usable signing material.
Can an EngineeringID employee sign a document on my behalf?
No. Sealing requires the user's authenticated session and an MFA challenge; the signing path is invoked only inside that authorization context. There is no internal API that lets an operator initiate a signature on behalf of a user.
When does BYO AWS KMS launch?
In active development; production timeline is gated on the customer onboarding pilot. KMS provider records, AWS SigV4 client, and signer module are written; final integration with the sealing pipeline and end-to-end audit are remaining.
If I use BYO KMS, what does EngineeringID actually hold?
The KMS key ID and the IAM role configuration. The private key never leaves your AWS account. We make a SigV4-signed KMS API call for each signature; you can revoke our access by removing the IAM grant, at which point we cannot sign even if our infrastructure is compromised.
How is rotation logged?
As a hash-chained audit event with actor, timestamp, old cert thumbprint, new cert thumbprint, and reason. Old documents continue to verify against the cert that signed them; new documents use the new cert. We never re-sign existing seals on rotation.
What digital signature formats do you produce?
Standard X.509 / PKCS#7 signatures embedded in the sealed PDF. We are not a Qualified Trust Service Provider (QTSP) and do not issue Qualified Certificates. Customers needing eIDAS-qualified signatures should consult their QTSP directly.

Your keys, your custody, our integration

Talk to our security team about whether platform-managed or BYO KMS fits your compliance posture.