Home Supported Standards Terms & Conditions Privacy Policy Documentation Contact About

← Return to home

Build a certificate authority — a Root CA, an Intermediate CA and an Issuing CA — and issue the leaf certificates any of them can sign: TLS server, TLS client for mutual authentication, code signing, S/MIME, OCSP responder, time stamping, smartcard logon and Kerberos PKINIT. All cryptography runs in your browser; nothing is uploaded — except by the TLS test at the foot of the page, which cannot be done here at all.

What is on offer: every extension, every algorithm, and where it is all kept

Every X.509v3 extension is editable, including its critical flag, and any extension at all can be added by OID. Every combination of signature algorithm (RSASSA-PKCS1-v1_5, RSA-PSS, ECDSA and Ed25519, over SHA-256/384/512, plus SHA-1 for testing what refuses it) and subject key algorithm (RSA 2048/3072/4096, ECDSA P-256/P-384/P-521, Ed25519) is available. Keys and certificates are kept in this browser so a CA is still there tomorrow, and can be exported as PEM, DER, JWK or PKCS#12.

This is the static (backend-less) deployment. Everything on this page works except the TLS test connection, which needs the API layer: a browser cannot choose which client certificate to present, cannot be given a truststore, and cannot read the handshake it made.

Certificate & Key Configuration
Issue a Certificate
What the profile does, and why every field it sets stays editable

The profile sets the extensions below to what that kind of certificate normally carries; every one of them is then editable, which is the point — issuing the certificate that is wrong in exactly one way is how you find out what refuses it and what does not.

Key Pair
Where this pair comes from

The key pair the next certificate certifies — and, for a Root CA, the key that signs it. This is the same key-pair pane the JWT Tools page carries, over the same module (client/src/key_material.js), so the algorithms, the PEM/JWK toggle and the keystore formats are identical rather than similar.

Export
Subject Distinguished Name
Why the order matters, and where a TLS name really lives

Written in the order shown — a Name is an ordered RDNSequence, and a reordered DN is a different name that chains to nothing. For a TLS server, note that the name a client checks is in subjectAltName and not here: every current browser ignores the Common Name entirely.

X.509v3 Extensions
Which extensions are here, and what the critical flag costs

Every extension RFC 5280 defines, plus the ones in common use that it does not, plus anything at all by OID. The critical flag is separately settable on each: a validator must reject a certificate carrying a critical extension it does not understand, so making the wrong one critical is a good way to find out what your stack actually implements.

Further OIDs
Any other extension
Keys & Certificates

Certificate Details & Chain

Select an object in the store above.

TLS / Mutual TLS Test Connection

This pane is switched off on this deployment, which has no API layer. The connection can only be made by one: a browser cannot choose which client certificate to present, cannot be given a truststore, and cannot read the handshake it made. Everything else on this page runs in the browser and is unaffected — run the debugger locally, or point it at an API-backed deployment, to open a real connection.

Why the browser cannot be asked to do this

A page cannot choose which client certificate to present — the browser picks from its own store through its own UI, so the certificate you issued thirty seconds ago is not offered and “present none” is not offerable. It cannot be given a truststore, so “does this chain verify against my root, and only mine” is unaskable. It cannot read the negotiated version, cipher, ALPN protocol or the server’s chain. And a failed handshake reaches script as a generic network error with the TLS alert — the one informative thing — discarded. So the API opens the socket and reports both sides of it.

Connection
Client certificate (mutual authentication)
Truststore
Ask the server what it saw
Why this end’s report is not the whole answer

What this end cannot know is which chain the server built out of what it sent, which anchor it verified against, or whether the certificate was accepted at all. Under TLS 1.3 it has not even been told: the client sends its Certificate and Finished last, so the handshake is complete from here before the server has said anything, and the verdict arrives afterwards — as an alert, or as a bare hang-up with no alert at all. A second connection is a different connection and proves nothing about this one, which is why the GET goes over this one. The mock STS answers this at /tls/whoami on 8443 and 9443; any server that will answer a GET can be asked. The method is GET and the path is the only part of the request you contribute — every header is built by the API, and a path containing a newline is refused rather than escaped.

Operations History
Why a page that uploads nothing keeps a log

Three of those four never leave the browser; the fourth is the only one that does. It is kept because a failing handshake ten minutes later always comes down to which certificate was presented — the store above holds the answer, and this holds the sequence.