Certificate Policy & Certification Practice Statement (CP/CPS)¶
RFC 3647 § — combined Certificate Policy (CP) and Certification Practice Statement (CPS) for a Certification Authority operated with secsy-pki (enterprise edition).
About this document¶
This is a template CP/CPS structured according to RFC 3647 (the IETF framework every WebTrust / CA/Browser-Forum audit expects). It is populated from the actual secsy-pki implementation: each subsection describes the technical control the software enforces, and, where relevant, cites the package or file that implements it. The companion compliance control mapping traces individual CA/Browser-Forum Baseline-Requirement clauses to the same code with an explicit gaps column.
A CP/CPS is a legal and organizational document, not only a technical one. A running CA is a deployment of secsy-pki operated by a specific organization inside a specific facility under specific contracts — facts this repository cannot know. Wherever the policy requires an organizational, physical, legal, or procedural fact that the software cannot itself assert, the text uses an explicit placeholder:
[OPERATOR: …] — a fact the deploying organization MUST supply and formally adopt before this document describes a real, auditable CA.
Do not publish this file verbatim as your CA's policy. Complete every
[OPERATOR: …] placeholder, assign your registered policy OID(s), have it
reviewed by counsel and your auditor, and version it under change control.
Software capabilities are described in the present tense ("the CA signs on the
HSM"); they are accurate for a default enterprise build and verifiable against
the cited code.
- Software version / scope: secsy-pki
mainbranch (this repository). - Document status:
[OPERATOR: draft | approved] - Policy OID(s):
[OPERATOR: your registered arc, asserted via profiles.*.policies — see §7.1.6] - Effective date / version:
[OPERATOR: …] - Policy administration & approval authority (Policy Authority / PMA):
[OPERATOR: …]
1. Introduction¶
1.1 Overview¶
secsy-pki is an HSM-backed X.509 (and OpenSSH) Certification Authority with
envelope-based secret encryption, role-based access control, and a
tamper-evident audit log. The defining architectural property, from which the
rest of this policy follows, is that CA private keys are generated inside a
hardware security module and never leave it — there is no software path that
exports a CA private key
(ADR 0002;
internal/pki/signer.go, internal/keyprovider).
The CA supports a hierarchy of one or more root CAs and subordinate intermediate CAs, each backed by its own non-extractable HSM key. Roots normally stay offline; day-to-day issuance is delegated to intermediates. End entities are issued from named issuance profiles (§7.1) that pin key usage, extended key usage, validity caps, and policy extensions, and every issuance runs a fail-closed pre-issuance gate pipeline (§4.2) before any signature.
1.2 Document name and identification¶
This document is the secsy-pki CP/CPS. The CA MAY assert one or more
certificate-policy OIDs in issued certificates via a profile's policies
configuration (internal/certpolicy); those OIDs, and the CPS-URI pointer
carried alongside them, are the on-certificate identifiers that bind a leaf to
this document. [OPERATOR: register a policy OID arc and record it here and in
profiles.*.policies.oids; set policies.cps to the published URL of this
document.]
1.3 PKI participants¶
- Certification Authorities. The root and intermediate CAs operated by this
deployment (
internal/ca). Each has a non-extractable HSM key and issues per §4. - Registration Authority (RA) functions. Identity/authorization validation
is performed by the automated enrollment protocols and by human operators:
ACME (RFC 8555,
internal/acme), EST (RFC 7030,internal/est), SCEP (RFC 8894,internal/scep), CMP (RFC 9483,internal/cmp), and BRSKI (RFC 8995,internal/brski). Operator/API issuance is authorized through RBAC (§5.2). See §3 for the identity-validation each performs. - Subscribers. Entities (servers, workloads, devices, people via S/MIME, SSH principals) that hold a certificate/key pair issued by the CA.
- Relying parties. Entities that validate certificates issued by the CA, including consuming the repository artifacts in §2.
- Other participants. Certificate Transparency logs (
internal/ct), time-stamping authority (RFC 3161,internal/tsa), and any external HSM/KMS, MASA (BRSKI), or SIEM the deployment integrates. [OPERATOR: name your chosen CT logs, HSM vendor/model, and SIEM.]
1.4 Certificate usage¶
- Appropriate uses. Each profile constrains use through key usage / EKU
(§7.1.2). Built-in profiles include
server(TLS serverAuth),client(clientAuth/mTLS),server-client,code-signing, thesmime*family (emailProtection),spiffe-svid(workload identity), and PQC/hybrid variants (internal/ca/profile.go). - Prohibited uses. Any use inconsistent with a certificate's key usage / EKU
and with [OPERATOR: the CA's acceptable-use terms]. Certificates issued
from non-
Publicinternal profiles are not publicly trusted and MUST NOT be represented as such.
1.5 Policy administration¶
- Organization administering the CP/CPS:
[OPERATOR: …] - Contact / problem-report address:
[OPERATOR: security@…, and the certificate-problem-report intake that feeds the revocation workflow in §4.9] - CPS approval procedures:
[OPERATOR: your Policy Authority review/approval and change-control process.]
1.6 Definitions and acronyms¶
Standard PKI terminology (CA, RA, CSR, CRL, OCSP, HSM, EKU, SAN, SCT, MPIC) is used as defined in RFC 5280, the CA/Browser Forum Baseline Requirements, and RFC 6960/6962. Product-specific terms: profile (§7.1), key provider (the HSM/KMS abstraction, ADR 0001), pre-issuance gate (§4.2), audit anchor (§5.5).
2. Publication and repository responsibilities¶
2.1 Repositories¶
The server publishes CA and revocation artifacts over its API, and can mirror
them to a static repository (directory or S3-compatible object store) for CDN
offload (internal/publish, docs). Publication uses
an atomic swap plus a SHA-256 integrity manifest so relying parties never
read a half-written artifact.
2.2 Publication of certification information¶
| Artifact | Endpoint (default) | Notes |
|---|---|---|
CA certificate / chain (AIA caIssuers) |
GET /api/ca/{id}/chain |
Combined overlap chain across key rollover (internal/ca rotation). |
| Complete/base CRL | GET /api/ca/{id}/crl |
Public, unauthenticated (handlers.go). |
| Delta CRL | GET /api/ca/{id}/crl/delta |
RFC 5280 delta (§7.2). |
| Sharded CRLs | GET /api/ca/{id}/crl/partition/{shard}[/delta] |
When partitioning is enabled (§7.2). |
| OCSP | POST /api/ca/{id}/ocsp, GET /api/ca/{id}/ocsp/{req} |
RFC 6960 (§7.3). |
| DANE TLSA / SSHFP records | GET /api/ca/{id}/dns-records/tlsa, POST /api/ssh/cas/{id}/dns-records/sshfp |
Pinning-record generation (internal/dnsrecords). |
| Enrollment directories | /acme, /.well-known/est, /.well-known/brski, /scep, /cmp |
Automated issuance (§3, §4). |
| Time-stamp authority | /tsa |
RFC 3161 (internal/tsa). |
| CPS pointer | id-qt-cps qualifier in certificatePolicies |
Set per profile via policies.cps (internal/certpolicy). |
[OPERATOR: publish the URLs actually stamped into your certificates' CDP/AIA and this document's canonical URL; keep them stable.]
2.3 Time or frequency of publication¶
CRLs are re-issued on revocation and on a schedule so a fresh CRL is always
available before the previous nextUpdate; base and delta CRL validity are
configurable (crl config; delta default validity ~1 hour). Pre-signed OCSP
responses are refreshed on a background schedule so the responder answers
without an HSM round-trip and survives an HSM outage
(internal/ca/presign.go). The audit head is anchored on a schedule via
RFC 3161 (§5.5). [OPERATOR: state your CRL nextUpdate interval, OCSP
freshness, and CA-certificate/CP-CPS publication cadence.]
2.4 Access controls on repositories¶
Repository read endpoints (CRL, OCSP, chain) are public and read-only. All
mutating and administrative endpoints are authenticated and RBAC-gated (§5.2),
and public endpoints are rate-limited with a bounded HSM-concurrency guard
(internal/ratelimit). [OPERATOR: front the repository with your CDN/WAF and
state its availability SLA.]
3. Identification and authentication¶
3.1 Naming¶
- Name forms. Subject DN and Subject Alternative Names are taken from the
CSR/profile; profiles constrain SAN types and, for public TLS, require the SAN
and that a DNS/IP-shaped CN also appear in the SAN (
internal/certlint, §7.1.4). S/MIME profiles validate, normalize (punycode), and allowlist rfc822Name SANs (internal/smime). SPIFFE SVIDs carry a singlespiffe://URI SAN (internal/spiffe). - Meaningful names / uniqueness / dispute resolution.
[OPERATOR: your naming, name-uniqueness, and name-dispute policy — organizational.]
3.2 Initial identity validation¶
The method of proving control/authorization depends on the enrollment path; the CA does not assert possession of an identity it did not validate.
- Proof of private-key possession. Every CSR-based path verifies the CSR signature; challenge/POP is enforced per protocol (ACME key authorization, CMP POP, EST/SCEP).
- Domain control (TLS). ACME implements challenge-based domain validation:
http-01,dns-01, andtls-alpn-01(RFC 8737). Every DNS-named issuance — ACME or operator-driven — additionally passes the fail-closed CAA gate (RFC 8659 + RFC 8657accounturi/validationmethods), so a domain owner's CAA records can pin issuance to this CA and to a specific account/method (internal/caa, §4.2). - Device / IoT identity. EST/SCEP use challenge-password grants and
optional hardware key attestation (TPM/YubiKey,
internal/attestation). BRSKI validates a manufacturer IDevID against trust anchors and an RFC 8366 voucher before bootstrapping (internal/brski). - Mailbox control (S/MIME). ACME
email-reply-00(RFC 8823) proves control of the mailbox via a signed reply; mailbox SANs are validated and allowlisted (internal/mailtransport,internal/smime). - Organization / individual identity (OV/EV). [OPERATOR: automated validation covers domain/mailbox/device control (DV-class). Any organization- or individual-identity vetting (OV/EV, RA registration procedures, evidence retention) is an operator RA process — describe it here.]
3.3 Identification and authentication for re-key requests¶
Renewal/re-key over ACME/EST/CMP re-runs the same domain/device validation and
gates as initial issuance. Operator-driven renewal is RBAC-authorized (§5.2).
The host agent (internal/agent) re-enrolls before expiry using ARI-driven
scheduling. [OPERATOR: state any re-validation interval / reuse limits.]
3.4 Identification and authentication for revocation requests¶
Revocation requests are authenticated: operator/API revocation requires the
cert:issue capability (and WebAuthn step-up for high-risk operations, §5.2);
ACME revocation requires control of the account or certificate key. Bulk /
incident revocation is an approver-gated, dry-run-first workflow
(internal/ca bulk revoker, internal/approval, incident
runbook). [OPERATOR: publish how a third party files a
Certificate Problem Report and your acknowledgement SLA.]
4. Certificate life-cycle operational requirements¶
4.1 Certificate application¶
Applications arrive as CSRs via an enrollment protocol (§3.2) or an authenticated operator/API/console request. The requesting profile determines the certificate shape and the gates that must pass.
4.2 Certificate application processing — the pre-issuance gate pipeline¶
Every end-entity issuance runs the following fail-closed checks before any
HSM signature (ADR 0003;
internal/ca/ct.go buildLeaf). If a gate cannot positively authorize the
request, issuance is refused and an audit event + metric is emitted.
- FIPS policy gate (when
security.fipsis on): rejects non-approved algorithm profiles (internal/fips, §6.7). - S/MIME policy gate: validate/normalize/allowlist mailbox SANs for S/MIME
profiles (
internal/smime). - Certificate-policy extension assembly: stamp the profile's policy OIDs so
the linter sees the final certificate (
internal/certpolicy). - Pre-issuance lint gate: hand-rolled CA/Browser-Forum Baseline-Requirements
checks (always on), plus the optional
zlintsuite under thezlintbuild tag (internal/certlint, §7.1). An enforce-mode finding aborts issuance. - CAA gate (RFC 8659/8657): resolve and evaluate CAA for DNS identifiers;
in
enforcemode a prohibiting record or a resolution failure blocks issuance (internal/caa). - Name Constraints gate (RFC 5280 §4.2.1.10): reject a leaf outside the
issuing CA's permitted subtrees / inside an excluded subtree
(
internal/nameconstraints). - Certificate Transparency (when enabled per profile): HSM-sign a
precertificate, submit to logs, enforce the min-SCT policy, embed the SCT
list, then HSM-sign the final certificate (
internal/ct). CT is fail-closed by default, per-profile fail-open opt-in.
Operator/API issuance under a profile with require_approval is additionally
held for four-eyes approval before the certificate is delivered
(internal/issueapproval, §5.2). Automated protocol flows deliberately bypass
the manual gate.
4.3 Certificate issuance¶
On passing all gates the CA signs the leaf on the HSM (internal/pki), records
it (with a per-CA SHA-256 uniqueness constraint), and emits a cert.issue audit
event. Serial numbers are 128-bit CSPRNG values (§6.1, §7.1.3).
4.4 Certificate acceptance¶
Delivery is via the enrollment-protocol response, the API/console, or a
server-side-keygen PKCS#12 bundle where the subject key is generated server-side
and the CA key never leaves the HSM (internal/pkcs12). [OPERATOR: define
what constitutes subscriber acceptance in your Subscriber Agreement.]
4.5 Key pair and certificate usage¶
Subscribers and relying parties must use certificates consistently with their key usage / EKU and this policy (§1.4). CA key usage is limited to signing by HSM attributes (§6.2).
4.6–4.8 Renewal, re-key, modification¶
Renewal/re-key re-run validation and the gate pipeline (§3.3, §4.2). Certificate modification is issuance of a new certificate; fields are never edited in place. Intermediate CA key rollover uses a dual-chain overlap window so relying parties trust both the old and new keys during transition (ADR 0004, rotation docs).
4.9 Certificate revocation and suspension¶
- Circumstances / who can request / grace period. Key compromise, misissuance, affiliation change, cessation, superseded, etc. (reason codes in §7.2). Requests are authenticated per §3.4. [OPERATOR: adopt the CA/Browser-Forum revocation timelines — 24 hours for §4.9.1(1) reasons, 5 days for the rest — as a binding SLA; the software provides the tooling but does not itself enforce the wall-clock deadline.]
- Mechanisms. Revocation is published via CRL (base + delta + optional
sharding) and OCSP (
internal/ca/crl.go, OCSP responder). Bulk/incident revocation regenerates CRL+delta once at the end of the run and invalidates the OCSP cache + refreshes presigned responses (incident runbook). - Suspension (certificateHold) and release. Reversible hold
(
certificateHold, reason 6) and release (removeFromCRL, reason 8 in the next delta) are supported (internal/handlers/hold.go, suspend/hold docs). [OPERATOR: the BRs prohibit suspension for publicly-trusted TLS server certificates — restrict hold to internal/other profiles, or disable it, per your policy.] - Status checking availability. See §4.10.
4.10 Certificate status services¶
- CRL with monotonic CRL numbers,
nextUpdate, delta CRLs (2.5.29.27), issuing distribution point (2.5.29.28), and freshest-CRL (2.5.29.46). - OCSP per RFC 6960 with nonce (RFC 8954), an optional HSM-backed delegated
responder (
id-kp-OCSPSigning+id-pkix-ocsp-nocheck), TLS stapling, and batch pre-signing for CDN offload / HSM-outage survivability.
4.11–4.12 End of subscription; key escrow and recovery¶
CA private keys are never escrowed (non-extractable, ADR
0002). The optional M-of-N
escrow applies only to the separate secret-encryption layer's data keys
(Shamir-split DEK wrapped per recovery agent, internal/secret), and to
optional escrow of subject encryption keys in server-side-keygen S/MIME/PKCS#12
flows — never to any CA signing key. [OPERATOR: state whether subject-key
escrow is offered and its governance.]
5. Facility, management, and operational controls¶
5.1 Physical security controls¶
[OPERATOR: entirely organizational — data-center/rack physical access, HSM tamper protection tier, environmental controls, offline-root storage (safe/vault), media handling and destruction. secsy-pki assumes the HSM and hosts run in a physically controlled facility.]
5.2 Procedural controls — trusted roles and dual control¶
- Role-based access control (
internal/rbac) defines the trusted roles. Built-in roles:admin(full control),issuer(issue/renew/revoke, read audit, secret encrypt/decrypt),signer(artifact signing only — deliberately cannot mint certificates),auditor(read-only: audit/access/ event logs, approval queue),approver(approve/reject four-eyes requests only). Capabilities are expressed as actions (cert:issue,ca:manage,rbac:manage,secret:*,approval:approve,token:manage, …). Roles are platform- or tenant-scoped; a per-CA permission matrix (SIGN_CERTIFICATE/MANAGE_PERMISSIONS/CONFIGURE_CA) overlays fine-grained grants. - Separation of duties / dual control. The four-eyes / maker-checker gate
(
internal/approval) requires N distinct approvers for guarded operation classes —ca.create,ca.rotate,ca.retire,revocation.bulk,secret.kek_rotate,token.create, and per-profilecert.issue. Self-approval is denied by identity, and theapproverrole is separate from the roles that request the operations (ADR 0006, approvals docs). - Step-up authentication. High-risk operations (root init, intermediate
issue, cross-sign, rotate/retire, revoke, bulk revoke/issue) require WebAuthn
step-up for console sessions (
internal/authn, §5.2 & authentication docs). - Identification and authentication for each role. Operators authenticate via
OIDC SSO (claim/group→role mapping), mutual-TLS client-cert binding, native
scoped API tokens (
secsy_pat_, SHA-256 at rest), or a configured root account; sessions use HttpOnly cookies + CSRF (authentication docs).
[OPERATOR: number of persons per role, background-check and training requirements, and which specific individuals hold trusted roles.]
5.3 Personnel security controls¶
[OPERATOR: organizational — background checks, training, sanctions, contractor controls, role-qualification and separation-of-duties enforcement in HR terms.]
5.4 Audit logging procedures¶
- What is logged. An append-only event log records who did what, when, with
what result — including denied attempts. Event types cover the full lifecycle:
cert.issue/renew/revoke/revoke_bulk/suspend/release, gate outcomes (cert.lint,cert.caa,cert.nameconstraint,cert.attestation,cert.brski), CA lifecycle (ca.create/init_root/issue_intermediate/rotate/ retire/cross_sign), CRL publication, auth (auth.login/login_failed/logout/ step_up, WebAuthn), permission and approval events, and audit anchoring (internal/audit). - Tamper-evidence. Entries are SHA-256 hash-chained (each row binds its
content and the previous hash; a genesis hash starts the chain). Deletion,
reordering, or content edits break the chain and are detected by
VerifyChain/secsy-ca audit verify(§8). - Anchoring. See §5.5.
- Export & monitoring. At-least-once streaming to SIEM (syslog RFC 5424 /
CEF / webhook) with a durable per-sink cursor (
internal/siem); live operator SSE feed (internal/eventstream). - Retention / review / vulnerability of the log.
[OPERATOR: retention period (BRs: audit-log records ≥ 2 years / per your auditor), review cadence, and off-box storage.]
5.5 Records archival & audit anchoring¶
The hash chain proves internal consistency but not against a party who can
rewrite the entire store. RFC 3161 audit anchoring defeats that: the CA
periodically obtains a time-stamp token over the chain head (seq, head_hash)
from a TSA it does not control (internal /tsa or an external TSA), stored in
audit_anchors (internal/anchor; secsy-ca audit anchor). Verification
detects truncation or rewrite behind an anchor. [OPERATOR: archival media,
retention, and off-site copies of the DB dump, config, and audit chain — see
§5.7 backups.]
5.6 Key changeover¶
Intermediate signing keys are rotated with a dual-chain overlap window (§4.6, ADR 0004); combined chains are published so validation succeeds across the change. [OPERATOR: root changeover procedure and schedule.]
5.7 Compromise and disaster recovery¶
- Incident handling. Key-compromise mass revocation is a scoped, dry-run-first, resumable, approver-gated workflow (incident runbook).
- Backups. A leader-elected job produces a DR artifact (logical DB dump +
config + public CA material + audit-head fingerprint), envelope-encrypts it
under the HSM-backed KEK, and writes it to a directory/S3 store with retention
(
internal/backup, backup docs). No private CA key is ever in a backup (ADR 0002). - Restore verification. A companion job restores the newest artifact into an isolated scratch database, runs the integrity gate, and confirms the audit-head fingerprint — closing the loop that a backup is actually restorable.
- DR drills.
scripts/dr-drill.shandscripts/dr-drill-full.shexercise token/DB loss → restore → verify, including PostgreSQL PITR and audit-chain continuity (key ceremony & DR). - HSM-shaped recovery. Because CA keys are non-extractable, recovery restores the HSM token (or re-runs a key ceremony) and reattaches metadata; you cannot reconstitute a CA from a file backup alone.
5.8 CA or RA termination¶
[OPERATOR: termination plan — final CRL issuance, revocation/expiry of subordinate CAs, notification of relying parties, archival transfer, and key-material destruction procedures.]
6. Technical security controls¶
6.1 Key pair generation and installation¶
- Generation. CA key pairs are generated on the HSM through the key
provider (
internal/keyprovider,internal/pki/signer.go); the private key is created on the device and there is no export API (ADR 0002). - Algorithms & sizes. RSA-2048 / RSA-4096, ECDSA P-256 / P-384 / P-521, and
Ed25519 on PKCS#11; RSA < 2048 is rejected. ML-DSA (FIPS 204) pure-PQC and
hybrid are supported only on the software provider, outside the validated
module boundary (
internal/keyprovider,internal/pqc). - Ceremony. Root/intermediate generation can be run as an M-of-N quorum
key ceremony with recorded, hash-committed operator confirmations
(
secsy-ca ceremony, key ceremony docs). - Serial numbers. 128-bit CSPRNG (
crypto/rand), exceeding the ≥ 64-bit entropy requirement (internal/pki, §7.1.3). - Signature/hash. SHA-256 or stronger, selected by key type (SHA-384/512 for P-384/P-521); SHA-1 is never used for signing and is rejected under FIPS policy.
6.2 Private-key protection and cryptographic-module controls¶
CA (and TSA, KEK) private keys are generated with PKCS#11 attributes enforcing
non-extractability and least privilege: CKA_TOKEN=true, CKA_PRIVATE=true,
CKA_SENSITIVE=true, CKA_EXTRACTABLE=false, and capability-scoping
(CKA_SIGN=true, CKA_DECRYPT=false, CKA_UNWRAP=false for signing keys) —
internal/pki/signer.go. Labels are kept unique to avoid ambiguous key
resolution (duplicate-label pitfall).
Multi-token HSM high availability with health-tracked failover is supported
(internal/keyprovider HA provider). [OPERATOR: the FIPS 140-2/3 validation
level of the CA is a property of your chosen HSM — SoftHSM is for dev/CI only
and is NOT validated; state your production HSM's certificate.]
6.3 Activation data¶
The HSM PIN / credential is sourced at login-time from a file, environment
variable, HashiCorp Vault, or a cloud secret manager, with redaction and a
doctor pin.source check (internal/keyprovider PIN sourcing, Task
111). [OPERATOR: PIN custody, M-of-N HSM auth if your
device supports it, and activation-data handling.]
6.4 Computer / network / lifecycle security controls¶
- Transport is TLS and fail-closed: a missing/unreadable key/cert is a startup failure, never a cleartext downgrade (ADR 0003).
- Public endpoints are rate-limited with a bounded HSM-concurrency guard
(
internal/ratelimit). - Static analysis, race detection, fuzzing, and govulncheck gate the build
(
make lint/test-race/fuzz,internal/certlint/fuzz targets, supply-chain docs); releases carry SBOMs, cosign signatures, and SLSA provenance. - [OPERATOR: host hardening, patching, network segmentation, and change management for the servers and HSM network path.]
6.5 Time-stamping¶
An HSM-backed RFC 3161 TSA is available (internal/tsa, /tsa) and is used to
anchor the audit chain (§5.5). A doctor clock.skew check flags host↔database
clock divergence that would distort validity windows, CRL freshness, and audit
ordering. [OPERATOR: your trusted time source (NTP) and its integrity.]
6.6 Cryptographic module engineering / FIPS mode¶
A FIPS build (GOFIPS140, make build-fips) runs on the Go Cryptographic
Module and, with security.fips on, fail-closed rejects Ed25519 leaves, SHA-1
anywhere, RSA < 2048, and software-PQC paths at config load, key generation, and
issuance (internal/fips, FIPS docs).
7. Certificate, CRL, and OCSP profiles¶
7.1 Certificate profile¶
- 7.1.1 Version. X.509 v3.
- 7.1.2 Certificate extensions. Basic Constraints (leaves
cA=FALSE, enforced by the linter), Key Usage and Extended Key Usage per profile, Subject Alternative Name, Authority/Subject Key Identifier, CRL Distribution Points, Authority Information Access (OCSP + caIssuers), Certificate Policies (with optional CPS URI), Name Constraints on CAs, SCT list (when CT enabled), and — for hybrid profiles — alternative-signature extensions. Built-in profile key-usage/EKU/validity (internal/ca/profile.go):
| Profile | EKU | Default / Max validity |
|---|---|---|
server |
serverAuth | 397 d / 397 d |
server-client |
serverAuth+clientAuth | 397 d / 397 d |
client |
clientAuth | 365 d / 730 d |
code-signing |
codeSigning | 3 y / 3 y |
smime / -sign / -encrypt |
emailProtection | 365 d / 730 d |
spiffe-svid |
serverAuth+clientAuth | 1 h / 24 h |
pqc-server / hybrid-server |
serverAuth[+clientAuth] | 365 d / 397 d |
canary |
clientAuth | 1 h / 24 h |
- 7.1.3 Algorithm object identifiers / serial. Signature algorithms are
SHA-256/384/512 with RSA or ECDSA (or Ed25519, or ML-DSA on the software
provider). Serials are 128-bit CSPRNG; the linter requires ≥ 64 bits of
entropy (
internal/certlintserial_entropy,serial_positive). - 7.1.4 Name forms / constraints. Under a
Publicprofile the linter enforces: SAN present, CN∈SAN, no reserved/internal TLDs, no single-label or underscore DNS names, no non-globally-routable IP SANs, single leftmost wildcard only (internal/certlintsan_present,cn_in_san,internal_name,reserved_ip,wildcard). CA Name Constraints (2.5.29.30) are enforced pre-issuance (internal/nameconstraints). - 7.1.5 Validity. Per-profile
MaxValidity, plus a public TLS cap of 398 days underPublicpolicy (internal/certlintvalidity_tls_max,validity_cap,validity_order). - 7.1.6 Policy OIDs. Assigned per profile via
policies.oidswith an optionalid-qt-cpsURI and RFC 5280 policy mappings/constraints (internal/certpolicy). [OPERATOR: register and assert your policy OID.]
7.2 CRL profile¶
X.509 v2 CRLs with monotonically increasing CRL numbers, thisUpdate/
nextUpdate, Delta CRL Indicator (2.5.29.27), Issuing Distribution Point
(2.5.29.28) for sharding/partitioning, and Freshest CRL (2.5.29.46)
pointing base→delta (internal/pki/crl.go, internal/ca/crl.go). Sharding maps
serials deterministically by SHA-256. Supported reason codes: unspecified(0),
keyCompromise(1), cACompromise(2), affiliationChanged(3), superseded(4),
cessationOfOperation(5), certificateHold(6), removeFromCRL(8, delta only),
privilegeWithdrawn(9), aACompromise(10).
7.3 OCSP profile¶
RFC 6960 responses with statuses good / revoked / unknown and the error
responses malformed / internalError / tryLater / sigRequired / unauthorized;
nonce per RFC 8954 (1–32 octets, echoed); optional delegated responder
certificate carrying id-kp-OCSPSigning and id-pkix-ocsp-nocheck; TLS
stapling; and batch pre-signing (nonce requests always bypass the cache and are
signed fresh) — internal/pki/ocsp.go, internal/ca/ocsp.go,
internal/ca/presign.go.
8. Compliance audit and other assessments¶
- Self-assessment tooling (continuous / on-demand).
secsy-ca audit verify(hash-chain + RFC 3161 anchor verification), the offlinesecsy-verifychain-of-trust proof (HSM attestation: key generated-on-device, never-exported, sign-only),secsy-ca db verify(HSM-independent integrity gate),secsy-ca doctor(config/HSM/KMS/DB/audit-chain/CT-inclusion/clock/TLS preflight), the synthetic issuance canary (internal/canary), automated restore verification (§5.7), and an external-client interop/conformance suite (scripts/interop-test.shagainst acme.sh, openssl cmp/ocsp/ts, EST). - Control mapping. The compliance control mapping traces CA/Browser-Forum TLS BR, S/MIME BR, and WebTrust-for-CA principles to the implementing code with an explicit gaps column.
- Independent audit. [OPERATOR: a WebTrust for CA / ETSI EN 319 411 or CA/Browser-Forum audit is performed by a qualified external auditor on the operating organization — the software does not and cannot self-certify. Record your audit scheme, auditor, period, frequency, and last report.]
9. Other business and legal matters¶
RFC 3647 §9 is almost entirely organizational and legal. secsy-pki is
distributed under the MIT license (see repository LICENSE); that license
governs the software, not the CA service. Every clause below is an operator
responsibility:
- 9.1 Fees —
[OPERATOR] - 9.2 Financial responsibility (insurance, warranty reserves) —
[OPERATOR] - 9.3 Confidentiality of business information —
[OPERATOR] - 9.4 Privacy of personal information —
[OPERATOR: note that the audit log and issued certificates may contain personal data (e.g. S/MIME mailbox, operator identity); define your privacy handling.] - 9.5 Intellectual-property rights —
[OPERATOR] - 9.6 Representations and warranties (CA, RA, subscriber, relying-party
obligations) —
[OPERATOR] - 9.7 Disclaimers of warranties —
[OPERATOR] - 9.8 Limitations of liability —
[OPERATOR] - 9.9 Indemnities —
[OPERATOR] - 9.10 Term and termination —
[OPERATOR] - 9.11 Individual notices and communications —
[OPERATOR] - 9.12 Amendments —
[OPERATOR: CP/CPS change-control and notification.] - 9.13 Dispute-resolution provisions —
[OPERATOR] - 9.14 Governing law —
[OPERATOR] - 9.15 Compliance with applicable law —
[OPERATOR] - 9.16 Miscellaneous / other provisions —
[OPERATOR]
Change history¶
| Version | Date | Author | Notes |
|---|---|---|---|
| Template | — | secsy-pki | Initial RFC 3647 CP/CPS template generated from the implementation. Complete every [OPERATOR: …] placeholder before adoption. |
See also¶
- Compliance control mapping — CA/B-Forum & WebTrust → code.
- Architecture Decision Records — the load-bearing design decisions.
- Security review & hardening · Key ceremony & DR · RBAC & audit · Certificate authority · CAA · Certificate Transparency · Pre-issuance linting · FIPS mode.