Castell · SkyV2X

Trust anchor · Root CA

The cert
everything else roots in.

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

The three Castell trust anchors and what each signs TLM trust list manager 74534B8C394779F4 signs the ECTL attests Root CA inventory GET /tlm Root CA root certificate authority AD7B90E1EB12A0F9 issues EA / AA / MA anchors every cert chain GET /trustanchor MA misbehaviour authority 405D3CF914EB9E05 signs MR acks runs report audit trail GET /ma Vehicle
Three anchors. Three jobs. One pin recipe.

What a C-ITS trust anchor is

A trust anchor is the cryptographic origin of trust: a public key that a station accepts as authoritative because of out-of-band provenance, not because some other authority signed it. In C-ITS, three distinct trust anchors matter, and they serve different jobs:

All three are issued by Castell itself in the testbed model: Castell is the trust authority for stations using 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; they only change if Castell rotates a Root CA, which is announced ahead of time in the changelog.

AnchorHashedId8Endpoint
Root CAAD7B90E1EB12A0F9GET /trustanchor
TLM74534B8C394779F4GET /tlm
MA405D3CF914EB9E05GET /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/x-its-cert:

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 = "AD7B90E1EB12A0F9"

The cert is an explicit ECDSA cert per IEEE 1609.2: the public key is in the certificate body rather than reconstructed from a witness as in implicit certs. This makes it directly parseable by any 1609.2 tool without needing reconstruction values.

Why pinning by HashedId8

HashedId8 is the canonical short identifier of a certificate in C-ITS: SHA-256 of the certificate, truncated to its last eight bytes. Every message that references the trust anchor uses HashedId8 to do so — it's 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 present in the EU CPOC ECTL. A vehicle pinning Castell's Root CA will trust messages signed under Castell's hierarchy but will not by itself be trusted by stations operating in production C-ITS deployments. Use Castell for development, conformance work, decoder reference, interop trials — not for live road deployments.

Related material