india-pki-watch

Tamper-evident snapshots of India's PKI trust anchors and the CA-published artifacts behind them. If a certificate is silently re-issued, this archive makes it detectable by diff.

Why this exists

Every TLS connection to a *.gov.in site, every bank on the .bank.in zone, and every document-signing chain in India terminates — eventually — at a small set of certificate authorities licensed by the Controller of Certifying Authorities (CCA). In October 2026 the eMudhra/emSign chain compromise made those anchors first-class evidence. When a CA fixes a problem, it rarely announces it: roots get re-issued, files get replaced, Last-Modified headers quietly move. There is no public, timestamped record of what each CA served and when.

This repo is that record. Each snapshot is a dated directory of certificate files as served — bytes, HTTP headers, the page that linked them, and a SHA256SUMS.txt manifest — committed to git so the history of every re-fetch is externally verifiable.

Sources

SourceWhatSnapshot
cca-gov-in/CCA India root certificates page — the national root (CCA India 2022, CCA India 2022 SPL)2026-10-30 (2 certs)
emsign-repository/Full corpus of the eMudhra/emSign public repository — every cert the CA publishes, with its own fingerprints as cross-check2026-11-02 (131 certs; 15 newly listed)
idrbt-ca/IDRBT CA — unreachable (see findings)status note only
nic-ca/NIC CA — candidate; no public endpoint located yet—

Baseline fingerprints

CertificateSHA-256 (file as served)
CCA India 2022
serial 762433EB…, RSA-4096, valid 2022→2042
2427c86a7f7e7bbe1684b75cfe96537ab080d00b7d6acf0c4453b438f246e0ee
CCA India 2022 SPL
serial 628281C6…, RSA-4096, valid 2022→2042
6e92017ece0e2e752a59b37c0ebf0fb958311cc585deda1fdf12790eb99b3caf
emSign ECC Root CA - G3
the compromised-chain root; matches eMudhra's published fingerprint
86a1ecba089c4a8d3bbe2734c612ba341d813e043cf9e8a862cd5c57a36bbe6b

All 131 emSign-corpus certs verified against the SHA-256 fingerprints eMudhra itself publishes; 15 subordinate CA certificates are newly listed versus 2026-10-30, while the prior 116 certs remain byte-identical. CCA files captured with Last-Modified: 17 Sep 2025 12:06:51 GMT at fetch time.

Findings already on record

CCA India 2022 SPL ships a broken PEM. The file as served has a stray blank line before the END CERTIFICATE marker, so openssl x509 -in CCAIndia2022SPL.cer refuses to parse it. The embedded DER is intact. A national root CA distributing a root its own validators can't parse is its own hygiene finding — and exactly the kind of artifact detail Certificate Transparency can never capture.
idrbtca.org.in is dead in practice. The apex times out even from an Indian vantage point, the CRL endpoint returns 403, and the praman portal 404s. Meanwhile the entire .bank.in zone we swept (25 hosts) is served by an eMudhra intermediate (EM DV TLS CA - G2A-1), 8 more by emSign — consistent with the documented IDRBT→eMudhra procurement trail. India's banking-PK heritage CA is effectively off the air.
Provenance closure achieved. The intermediate captured in the wild from .bank.in TLS handshakes is byte-identical to the repository copy; the TrustCheck app's bundled G3 fixture decodes to the same root archived here. One chain of custody, three independent capture paths.
15 certificates newly listed by emSign. The 2026-11-02 fetch found eight UAE QTSP and seven InCommon subordinate CA certificates, all matching the publisher's fingerprints. The 116 certificates in the 2026-10-30 corpus are byte-identical; no root changed and no prior same-subject certificate was present for comparison. These are new issuance paths under existing roots, not evidence that device trust stores or DigiLocker pins changed.

How to verify

git clone https://github.com/CashlessConsumer/india-pki-watch.git
cd india-pki-watch
sha256sum -c cca-gov-in/2026-10-30-root-certs/SHA256SUMS.txt   # needs cwd fix; see script
bash scripts/check_ccaindia.sh     # re-fetches live certs, diffs vs latest snapshot
bash scripts/check_emsignrepo.sh   # re-fetches all published certs, checks vs published fingerprints

A byte mismatch can indicate a re-issue; a new or removed file is a corpus change that must be investigated separately. git log the snapshot dirs for the last-known-good bytes and diff. A weekly checker alerts on either condition — snapshots are only ever added, never edited.

What we deliberately don't collect

Context

This archive backs CashlessConsumer's eMudhra investigation and the cyber desk generally. The related app TrustCheck lets any Android user test whether their phone still trusts the compromised chains. Reach: github.com/CashlessConsumer/india-pki-watch · Pages: cashlessconsumer.github.io/india-pki-watch.