Check a Certanix evidence pack yourself, on your own machine, without contacting us. This page does it in your browser. The command line does it anywhere, including a machine with no network at all.
certanix-verify vault).Evidence packs are signed by a key generated in, and held by, a YubiHSM 2 hardware security module in FIPS mode. This is its public key, and the SHA-256 fingerprint of its DER-encoded SubjectPublicKeyInfo:
Fingerprint (SHA-256, DER SPKI)-----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEx09YPKh2p2eWTQGQDPxCJv1gO1ua E839xBqZZ4gFulq1a2iCpfx6ygb1yCKxkMJgIBHXNeM7Ahz0QMfG4Ps/ew== -----END PUBLIC KEY-----
Download: certanix-hsm.pub.
Packs signed before 4 September 2026 were signed with the previous key and keep verifying against it. If a pack names a different key, ask whoever sent it for that key and its fingerprint.
The schemas and vocabulary that packs reference are published at schema.certanix.eu. Verification never fetches them: the verifier carries its own copy, and a pack verifies with no network.
This runs certanix-verify, the same Python code as the command-line tool, inside your browser through Pyodide. Nothing about verification is reimplemented in JavaScript.
One dependency differs. The browser uses cryptography 47.0.0, the build Pyodide provides; the command-line tool pins cryptography 48.0.1. On every public test case of certanix-verify 0.14.0 (68 cases, each in JSON and in plain-text output), the browser and the command line gave identical results: the same exit code and the same output, byte for byte.
Loading the verifier (about 15 MB, from this site, once)…
For an archived artifact whose exact bytes are the claim. Nothing is recomputed, so any byte change fails, including a reformatting that the default mode accepts.
Python 3.10 or later. The tool needs the standard library and two pinned packages, and nothing else.
python3 -m pip install certanix-verify
For a machine with no network: download on a connected machine, carry the files across, install from them.
# connected machine python3 -m pip download certanix-verify -d certanix-verify-wheels # offline machine python3 -m pip install --no-index --find-links certanix-verify-wheels certanix-verify
curl -O https://certanix.eu/verify/keys/certanix-hsm.pub openssl pkey -pubin -in certanix-hsm.pub -outform DER | openssl dgst -sha256
The output must read 5849077784fa60616ea83e8bff35c8b294e17631a42435cd20192dd09d9f9ae5. Without openssl (Windows, for instance), the same value from Python:
python3 -c "import hashlib,sys;from cryptography.hazmat.primitives import serialization as s;k=s.load_pem_public_key(open(sys.argv[1],'rb').read());print(hashlib.sha256(k.public_bytes(s.Encoding.DER,s.PublicFormat.SubjectPublicKeyInfo)).hexdigest())" certanix-hsm.pub
certanix-verify verify evidence-pack.json --key certanix-hsm.pub
echo $? # 0 = verified; any other value is the reason it did not
Add --json for one machine-readable object. certanix-verify --help lists the other modes.
certanix-verify is released under the BSD-3-Clause-Clear licence. Who holds the copyright: NOTICE. Patents: PATENTS-NOTICE, also as PATENTS-NOTICE (plain text). The licence itself grants no patent rights.
The exit code is the reason, so a script can act on why a pack failed without reading text.
| Code | Class | Meaning |
|---|---|---|
| 0 | OK | Signature valid over the canonical bytes; schema valid; no gate violation. |
| 1 | USAGE | Could not start: unreadable file, missing key, bad invocation. Says nothing about the pack. |
| 2 | MALFORMED_INPUT | Not readable as a JSON object (for example, truncated). |
| 3 | SCHEMA_INVALID | Readable, but does not match the schema. The signature was not reached. |
| 4 | UNSUPPORTED_SCHEMA_VERSION | A schema version or artifact type this verifier does not know. Refused rather than guessed. |
| 5 | SIGNATURE_MISSING | The pack carries no signature. |
| 6 | SIGNATURE_MALFORMED | A signature is present but cannot be decoded. |
| 7 | SIGNATURE_MISMATCH | These are not the bytes that were signed, or not under this key. |
| 8 | KEY_MISMATCH | The signature names a different signer from the key supplied. |
| 9 | GATE_VIOLATION | Signed and well formed, but claims a capability its recorded gate denies. |
Codes 10 to 13 belong to certanix-verify vault, which checks a trusted timestamp record.
Download the sample pack (pack schema ), then verify it above or on the command line:
SHA-256 of the file