Castell · SkyV2X

Trust anchor · Root CA

The C-ITS
trust anchor

A trust anchor is the certificate a station chooses to believe unconditionally. In C-ITS it's the Root CA. Castell's is downloadable and pinnable by HashedId8.

The three Castell trust anchors and what each signs TLM trust list manager B52CD033B4BA4AE4 signs the ECTL attests Root CA inventory GET /tlm Root CA root certificate authority D5CC48BA56F87FCA issues EA / AA / MA anchors every cert chain GET /trustanchor MA misbehaviour authority 7F86BAC4F35D6505 signs MR acks runs report audit trail GET /ma Vehicle
The Root CA, TLM and MA, and how a station pins each.

What a C-ITS trust anchor is

A trust anchor is the cryptographic origin of trust, a public key a station accepts as authoritative because of out-of-band provenance rather than because some other authority signed it. C-ITS has three distinct trust anchors, each with its own job:

In the testbed model Castell issues all three itself. Castell is the trust authority for stations that use it. In production, the Root CA is one of dozens listed in the EU CPOC ECTL, the TLM is the CPOC TLM, and the MA is jurisdiction-specific.

Castell's trust anchors: live

Pin these HashedId8 values out of band before exchanging any signed wire with Castell. They are stable across releases and change only if Castell rotates a Root CA, which the changelog announces ahead of time.

AnchorHashedId8Endpoint
Root CAD5CC48BA56F87FCAGET /trustanchor
TLMB52CD033B4BA4AE4GET /tlm
MA7F86BAC4F35D6505GET /ma

Values above are the live ones at page render. The machine-readable equivalent is /status.json under trust_anchors.{root,tlm,ma}. Programmatic clients should consume that, not parse this table.

How to download and pin

The Root CA certificate is served as COER-encoded bytes under application/octet-stream:

curl -sS https://pki.skyv2x.com/trustanchor -o root-ca.coer
wc -c root-ca.coer
# 410 bytes

# Compute SHA-256 and derive HashedId8 (last 8 bytes)
sha256sum root-ca.coer
# 8f...e2  root-ca.coer

# Pin the HashedId8 in your stack config:
# trust_anchor_hashedId8 = "D5CC48BA56F87FCA"

The cert is an explicit ECDSA cert per IEEE 1609.2. The public key sits in the certificate body rather than being reconstructed from a witness as in implicit certs, so any 1609.2 tool can parse it without reconstruction values.

Why pinning by HashedId8

HashedId8 is the canonical short identifier of a certificate in C-ITS, the SHA-256 of the certificate truncated to its last eight bytes. Every message that references the trust anchor uses HashedId8 to do it. That is what flows on the wire, not the full cert.

Pinning by HashedId8 instead of by full byte comparison lets a stack accept legitimate format-level changes (re-encoding, attribute reordering inside the cert) as long as the on-wire identity is preserved. It also keeps the pinned value short enough to embed in build artefacts and config files.

Caveat: this is a testbed Root CA

Castell's Root CA is a testbed trust anchor. It is not in the EU CPOC ECTL. A vehicle that pins Castell's Root CA will trust messages signed under Castell's hierarchy, but stations in production C-ITS deployments will not trust it in turn. Use Castell for development, conformance work, decoder reference and interop trials, not for live road deployments.

Related material