C=US
Identity, trust, and rights-preserving design

Back to the C=US proposal

Mutual TLS evidence, 2026-10-03

AI agents authenticating with X.509v3 client certificates

Two live tests run on 2026-10-03. In the first, Claude authenticates with its own mTLS client certificate, whose key is held on a YubiKey. In the second, a grading-sensor agent authenticates with a key sealed in a TPM 2.0. The results are in evidence.json, signed with Claude's YubiKey slot 9C key.

DEMONSTRATION ONLY. The c=US root is a demonstration root, not a public certificate authority. The directory behind these services is a fixture, not a live LDAP server. No network or OpenLDAP write occurred.

Results

1. Claude's mTLS client certificate (YubiKey PIV slot 9A) to agent.sugarbushagent.com

Cloudflare's edge verifies the certificate against the Cloudflare-managed client CA. The Worker maps the verified fingerprint to the directory entry and checks its status, scope and grant window. The operator entered the PIV PIN in the Windows smart-card prompt.

RequestResult
GET /whoamiHTTP 200, authenticated. Mapped to cn=claude-agent,ou=AI-Agents,o=Cequs,c=US (wimse://cequs.com/agents/claude), status active.
POST /grade maple.lot.grade.proposeAllowed: authorized certificate and directory grant
POST /grade maple.lot.grade.finalizeRefused: requested scope is not granted

2. TPM-held sensor agent key to farm.sugarbushagent.com

TLS 1.3 with tlslite-ng. The TPM 2.0 signs the TLS CertificateVerify (TPM2_Sign), so the private key never leaves the TPM. The certificate was issued only after TPM attestation, with an EK chain to the manufacturer root.

ClientResult
The sensor, with its TPM keyHTTP 200, authenticated as wimse://cequs.com/agents/tpm-agent-demo-001, issuer c=US root. One signature made inside the TPM.
Attacker: the sensor's real certificate, a different keyStopped in the TLS handshake by Cloudflare: the CertificateVerify didn't match the certificate
Attacker: self-signed lookalike, same name and agent IDHTTP 403: not issued by the c=US root

Certificates

FileSubject, SAN, EKUIssuer
claude-mtls-client-cert.pemCN=claude-agent mTLS client, OU=AI-Agents
EKU clientAuth. Valid to 2026-12-30.
SHA-256 9EC5271AE068F262EF3D24D72B2B6538F625F9F0E1D587380B11C8D5E523F6CD
Cloudflare managed client CA (not the c=US root: on Cloudflare's Free plan the edge can only trust its own managed CA)
tpm-agent-cert.pemCN=tpm-agent-demo-001, OU=AI-Agents (TPM-attested)
SAN wimse://cequs.com/agents/tpm-agent-demo-001, EKU clientAuth. Valid to 2026-11-01.
SHA-256 7E442AADD52F54018B2FC992D6B10AE11BB54530659D54E020C83F7E0B15B96F
c=US root
claude-signer-cert.pemClaude's signing certificate (YubiKey slot 9C), used to sign evidence.json and the email
SHA-256 906131CFB8EE80C8207EBD13B942BC5A30DDE226AD2791CA42509D727B792F39
c=US root
c-us-root.pemc=US demonstration root; its key is on a YubiKey (slot 82)
SHA-256 D0F735A3FEE9316BA0AF39828B9D87FCFB39E8958DC3C39265E5BDBC590460E4
self-signed

All four are X.509 v3.

Verify

# The TPM agent's and Claude's signing certificates are issued by the c=US root
openssl verify -CAfile c-us-root.pem tpm-agent-cert.pem claude-signer-cert.pem
openssl x509 -in c-us-root.pem -noout -fingerprint -sha256

# evidence.json is signed by Claude's slot 9C key and unchanged
openssl x509 -in claude-signer-cert.pem -pubkey -noout > claude-pub.pem
openssl dgst -sha256 -verify claude-pub.pem -signature evidence.json.sig evidence.json

# Certificate details
openssl x509 -in tpm-agent-cert.pem -noout -text

Expected: both certificates OK, the root fingerprint above, and Verified OK.

The live mTLS calls can't be replayed by a third party: only the YubiKey and the TPM hold the keys, which is the point. If you'd like to watch them run, Peter can show you live.

Related