Repository navigation
Upgrade certifi to 2026.10.19 and require it (emSign CA compromise) - #100
Merged
Merged
Conversation
certifi 2026.10.19 drops "emSign ECC Root CA - G3", the root that the TLS intermediates exposed in the October 2026 eMudhra/emSign key compromise chain to. Lockfile-only change; no other package moved. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
The SDK uses certifi.where() as its default CA bundle, so SDK users trust whatever certifi they have installed. Raising the floor makes upgrading the SDK also pull in the bundle without "emSign ECC Root CA - G3". The template is updated too so regeneration keeps the floor. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
sgrammargs
marked this pull request as ready for review
October 21, 2026 18:26
bradymholt
added a commit
that referenced
this pull request
Oct 21, 2026
Changes like the certifi floor raise in #100 need a version bump before they can be published, which otherwise takes a second PR.
bradymholt
added a commit
that referenced
this pull request
Oct 21, 2026
* Bumping version for 4.4.1 * Add AGENTS.md so agents bump the version with consumer-facing changes Changes like the certifi floor raise in #100 need a version bump before they can be published, which otherwise takes a second PR. * Scope AGENTS.md version bump guidance to security update PRs
|
The changes in this PR were just released in 4.4.1 🎉. |
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.
Why
In October 2026 the private keys of eight eMudhra/emSign intermediate CA certificates leaked.
certifi2026.10.19 removesemSign ECC Root CA - G3, the root those TLS intermediates chain to. This PR movespoetry.lockfrom certifi2026.7.22to2026.10.19and raises the SDK's published minimum tocertifi >= 2026.10.19, so SDK users get the fix too.emSign ECC Root CA - G3from the bundled CA storeNo advisory ID covers certifi, so the branch is named after the target version. CVE-2026-111943 is Go's CVE for this incident, not a certifi advisory.
Exposure: certifi is a direct dependency (previously
certifi >= 2024.2.2).ynab/configuration.pyusescertifi.where()as the defaultssl_ca_certfor every API call, so the SDK trusts exactly certifi's bundle.Why 2026.10.19 is safe
certifi contains only the CA bundle plus
where()/contents(). Between2026.7.22and2026.10.19,core.pyis unchanged;__init__.pychanges only__version__. I parsed the bundles withopenssl x509:emSign ECC Root CA - G3was removed (121 → 120 roots).AAA Certificate Services(Sectigo/Comodo) is not in 2026.10.19. The compromised intermediates also have copies cross-signed by that root, but with certifi alone those copies have no trusted root to chain to.emSign Root CA - G1,emSign Root CA - C1andemSign ECC Root CA - C3remain. The day before, 2026.10.18 had removed all four emSign roots. If any compromised intermediate chains to G1, this bump does not cover it.Wheel sha256:
42d35340cc5b9ba78e818ddbff0c5b1c2b779de448a340fd1b989f5fa8670e1b(matches PyPI).What changed
Two commits:
poetry update certifi --lockwith Poetry 2.5.1, the version that generated the lockfile. A package-by-package diff of the lockfile shows only certifi changed.certifi = ">= 2024.2.2"→">= 2026.10.19"inpyproject.tomlandtemplates/pyproject.mustache, so regenerating the SDK from the OpenAPI spec keeps the floor. Thenpoetry lock; Poetry 2.x keeps existing pins, so onlycontent-hashchanged.Why raise the floor: the lockfile only affects this repo's dev/CI environment. This is a public SDK, and
ynab/configuration.pydefaults tocertifi.where(), so users trust exactly the certifi they have installed. Raising the floor is the only waypip install -U ynabbrings in the bundle withoutemSign ECC Root CA - G3.Trade-offs for the release notes:
dbt-snowflakeis a known example: every release since 1.10.0 requirescertifi<2025.4.26(Why is dbt-snowflake still pinned to old version of certifi? dbt-labs/dbt-adapters#2230). Those users get a clear resolver error and can stay on the previous SDK version.ssl_ca_cert, or get their packages from a distro, need to update their CA bundle themselves.requirements.txt(used by tox) doesn't list certifi; tox gets it by installing the package itself, which now enforces the floor. I left that file as is.Verified
poetry installthenpytest: 162 passed (Python 3.10.20 from.tool-versions), after both commits.2026.10.19.poetry build→ wheelMETADATAcontainsRequires-Dist: certifi (>=2026.10.19).certifi==2026.7.22is rejected by the resolver ("requirements are unsatisfiable"), so the floor is enforced.🤖 Generated with Claude Code