Repository navigation
Stop trusting the compromised eMudhra CA certificates - #378
Merged
Merged
Conversation
certifi 2025.11.12 still includes "emSign ECC Root CA - G3", whose intermediate CA private keys were generated incorrectly and can be recovered from the public certificates. httpx, which fetches publisher artifacts and backs the Supabase client, reads certifi's CA list. Updated with "uv lock --upgrade-package certifi" using uv 0.13.4, the version setup-uv installs in CI. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #380
Summary
On 2026-10-20 it was disclosed that eight intermediate CA certificates operated by eMudhra (emSign brand) have private keys that can be recovered from the public certificates, so anyone can issue a certificate for any domain under them. Six TLS intermediates chain to the root "emSign ECC Root CA - G3", and all eight were also cross-signed under Sectigo's "AAA Certificate Services". Software that carries its own CA list and has not been updated still trusts them. Details: https://emudhra.we-have-a-problem.com
What in this repository trusted the affected root.
uv.lockpinned certifi 2025.11.12, which includes "emSign ECC Root CA - G3" (certifi 2026.10.19 removes it). httpx 0.28.1 verifies TLS against certifi's CA list by default, and this repository uses httpx for:chronicle/artifacts.pyandchronicle/source_package.py: downloading publisher artifacts from manifestsource_urls, includingscripts/fetch_r2_only_source_artifacts.py, which CI runs before the tests;db/supabase_client.py: the Supabase Python client, which sends its API key over httpx.I established this from the lockfile and the code paths above. No code in the repository disables certificate verification or sets a custom CA bundle (searched for
verify=,SSL_CERT_FILE,REQUESTS_CA_BUNDLE,ssl_ca,cafileand similar). The repository has no Dockerfile, Modal app or Vercel project, so the lockfile affects CI and local development only.Changes
uv.lock: certifi 2025.11.12 -> 2026.10.19, made withuvx uv@0.13.4 lock --upgrade-package certifi. uv 0.13.4 is the newest uv release and the versionastral-sh/setup-uv@v5installs in CI, since the workflows do not pin a uv version. That uv version also raised the lockfilerevisionfield from 3 to 5. No other package changed.changelog.d/emudhra-ca-trust-update.fixed.md: changelog fragment.Chronicle Governance
This PR does not touch the Chronicle source-data boundary: no source package, consumer contract or schema changes.
Tests
uvx uv@0.13.4 lock --locked: passes.uv lock --lockedwith uv 0.12.23 also passes.uv sync --locked --all-extraswith uv 0.13.4 into a temporary environment: installs.CERTIFICATE_VERIFY_FAILEDCERTIFICATE_VERIFY_FAILEDCERTIFICATE_VERIFY_FAILEDAfter merge
uv syncon an updatedmain.Environment variables: this PR does not change CI workflows or deployment code and adds no environment variables.
🤖 Generated with Claude Code