Kalypso is designed for local development only. It makes HTTPS easy in dev while minimizing the security risk of running a local CA.
Kalypso uses no third-party binaries. Trust store installation, certificate
generation, and key management are all handled natively using Python's
cryptography library and OS-native trust store commands.
- Default lifetime: 24 hours
- Maximum lifetime: 7 days
- If a dev cert leaks, it expires quickly
- Compare: self-signed certs and mkcert use 10+ year lifetimes
- ECDSA P-384 keys — 192-bit security (vs mkcert's P-256 / 128-bit)
- SHA-384 signatures — matched to P-384 curve strength
- Stronger than what mkcert, minica, and most dev CA tools use
pathLength=0— the root CA cannot create sub-CAskeyUsage=keyCertSign,crlSign,digitalSignature— nothing else- Subject Key Identifier included for chain validation
basicConstraints: CA=FALSE(critical) — certs cannot sign other certsextendedKeyUsage: serverAuth— only valid for TLS serversauthorityKeyIdentifier— links back to the issuing CA- Unique serial number per certificate
- Unique key pair per certificate
- Only the domains you specify are covered (no implicit wildcards)
- CA key written with 0600 permissions (owner read/write only)
os.open()with explicit mode — no window of insecure permissionskalypso status— verify key permissions and CA fingerprintkalypso load— warns if key permissions are too open
- Every issued cert gets a SHA-256 fingerprint for audit trail
- Displayed on
init,issue, andstatuscommands - Logged by the API server for every issuance
- macOS:
security add-trusted-cert(System Keychain) - Linux:
update-ca-certificates(Debian/Ubuntu) ortrust anchor(Fedora/Arch) - Windows:
certutil -addstore Root - Firefox/Chrome: NSS
certutilfor browser-specific databases - Clean subprocess environment — no env var leakage
- Explicit argument lists — no shell injection
- Command timeouts — no hanging on interactive prompts
This is intentional. Kalypso is for local dev and should never be exposed to the internet. Adding auth would make the Docker Compose integration harder without meaningful security benefit in a local context.
| Threat | Mitigation |
|---|---|
| Leaked dev cert | Expires in 24 hours (default) |
| Compromised CA key | Key stored with 0600 perms. Rotate: delete ~/.kalypso/, run kalypso init, kalypso trust |
| CA used to sign malicious certs | Only trust on dev machines, never in production |
| API exposed to internet | Don't do this. Bind to localhost or Docker network only. |
| Man-in-the-middle on API | API runs on local/Docker network. Use firewall rules if concerned. |
| Insecure key permissions | kalypso status checks and warns. kalypso init uses 0600 by default. |
| Supply chain (malicious CA in repo) | Never commit CA keys. .gitignore blocks *.pem by default. |
- Never use Kalypso in production — use Let's Encrypt or a real CA
- Keep the CA key secret — treat
ca-key.pemlike a password - Only trust the CA on dev machines — never add it to production trust stores
- Use short cert lifetimes — the default 24 hours is recommended
- Don't expose port 8200 — keep it on localhost or Docker internal networks
- Run
kalypso status— verify key permissions after setup - Never commit PEM files — the
.gitignoreblocks them by default