Jump to solution
Details

The Fix

pip install urllib3==1.26.3

Based on closed urllib3/urllib3 issue #2090 · PR/commit linked

Production note: Most teams hit this during upgrades or environment changes. Roll out with a canary and smoke critical endpoints (health, OpenAPI/docs) before 100%.

Open PR/Commit
@@ -482,36 +482,3 @@ class SecurityConst: errSecItemNotFound = -25300 errSecInvalidTrustSettings = -25262 - - # Cipher suites. We only pick the ones our default cipher string allows. - # Source: https://developer.apple.com/documentation/security/1550981-ssl_cipher_suite_values
fix.md
Option A — Upgrade to fixed release\npip install urllib3==1.26.3\nWhen NOT to use: Do not use this fix if you require specific custom cipher configurations.\n\n

Why This Fix Works in Production

  • Trigger: Investigate default TLS ciphers for pyOpenSSL
  • Mechanism: Uses system TLS ciphers if using OpenSSL 1.1.1+ or SecureTransport, allowing for better security configurations.
  • Why the fix works: Uses system TLS ciphers if using OpenSSL 1.1.1+ or SecureTransport, allowing for better security configurations. (first fixed release: 1.26.3).
Production impact:
  • If left unfixed, the same config can fail only in production (env differences), causing startup failures or partial feature outages.

Why This Breaks in Prod

  • Triggered by an upgrade/regression window: 1.1.1 breaks; 1.26.3 is the first fixed release.
  • Production symptom (often without a traceback): Investigate default TLS ciphers for pyOpenSSL

Proof / Evidence

  • GitHub issue: #2090
  • Fix PR: https://github.com/urllib3/urllib3/pull/2082
  • First fixed release: 1.26.3
  • Affected versions: 1.1.1
  • Reproduced locally: No (not executed)
  • Last verified: 2026-02-09
  • Confidence: 0.95
  • Did this fix it?: Yes (upstream fix exists)
  • Own content ratio: 0.66

Discussion

High-signal excerpts from the issue thread (symptoms, repros, edge-cases).

“IMO it makes more sense to special case LibreSSL as they decided to redefine OPENSSL_VERSION_NUMBER”
@tiran · 2020-11-25 · source
“@alex Thanks for the reply, it looks like the best way to determine the OpenSSL version of pyOpenSSL to use cryptography.hazmat.backends.openssl.backend.backend.openssl_version_number()”
@sethmlarson · 2020-11-25 · source
“Caution, >= 0x10101000 is no good with LibreSSL. It always reports OpenSSL version 0x20000000.”
@tiran · 2020-11-25 · source
“@tiran Yikes, is there a canonical way to detect OpenSSL & v1.1.1+?”
@sethmlarson · 2020-11-25 · source

Failure Signature (Search String)

  • Investigate default TLS ciphers for pyOpenSSL
  • https://github.com/urllib3/urllib3/pull/2082 makes system ciphers the default with stdlib `SSLContext` implementation. Can we take a similar approach with pyOpenSSL or should we
Copy-friendly signature
signature.txt
Failure Signature ----------------- Investigate default TLS ciphers for pyOpenSSL https://github.com/urllib3/urllib3/pull/2082 makes system ciphers the default with stdlib `SSLContext` implementation. Can we take a similar approach with pyOpenSSL or should we still rely on urllib3's default list?

Error Message

Signature-only (no traceback captured)
error.txt
Error Message ------------- Investigate default TLS ciphers for pyOpenSSL https://github.com/urllib3/urllib3/pull/2082 makes system ciphers the default with stdlib `SSLContext` implementation. Can we take a similar approach with pyOpenSSL or should we still rely on urllib3's default list?

What Broke

This could lead to weaker security configurations in production environments.

Fix Options (Details)

Option A — Upgrade to fixed release Safe default (recommended)

pip install urllib3==1.26.3

When NOT to use: Do not use this fix if you require specific custom cipher configurations.

Use when you can deploy the upstream fix. It is usually lower-risk than long-lived workarounds.

Fix reference: https://github.com/urllib3/urllib3/pull/2082

First fixed release: 1.26.3

Last verified: 2026-02-09. Validate in your environment.

Get updates

We publish verified fixes weekly. No spam.

Subscribe

When NOT to Use This Fix

  • Do not use this fix if you require specific custom cipher configurations.

Did This Fix Work in Your Case?

Quick signal helps us prioritize which fixes to verify and improve.

Prevention

  • Add a CI check that diffs key outputs after upgrades (OpenAPI schema snapshots, JSON payload shapes, CLI output).
  • Upgrade behind a canary and run integration tests against the canary before 100% rollout.
  • Add a TLS smoke test that performs a real handshake in CI (include CA bundle validation and hostname checks).
  • Alert on handshake failures by error string and endpoint to catch cert/CA changes quickly.

Version Compatibility Table

VersionStatus
1.1.1 Broken
1.26.3 Fixed

Related Issues

No related fixes found.

Sources

We don’t republish the full GitHub discussion text. Use the links above for context.