-
Notifications
You must be signed in to change notification settings - Fork 1.2k
PYTHON-5040 Regenerate test TLS certificates for Python 3.13/3.14 compatibility #2846
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
blink1073
wants to merge
60
commits into
mongodb:main
Choose a base branch
from
blink1073:PYTHON-5040
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Changes from 52 commits
Commits
Show all changes
60 commits
Select commit
Hold shift + click to select a range
06e8463
PYTHON-5040 Regenerate test TLS certificates with Authority Key Ident…
blink1073 5d18323
PYTHON-5040 Use test/certificates/ certs for SSL test client
blink1073 618acb8
PYTHON-5040 Export TLS cert paths from integration_tests/run.sh
blink1073 c3f98f1
PYTHON-5040 Use test/certificates/ certs for SSL integration test server
blink1073 d107450
PYTHON-5040 Use test/certificates/ certs for Evergreen SSL test client
blink1073 d16eb87
PYTHON-5040 Fix KMS mock server TLS for Python 3.13
blink1073 ca0b746
PYTHON-5040 Fix x509 auth username and CRL revocation in test certs
blink1073 afd411c
PYTHON-5040 Fix CSFLE TLS certs and configure-env for Python 3.13
blink1073 7ebc4c0
PYTHON-5040 Fix CA keyUsage and remove issuer from leaf cert AKI
blink1073 d113796
PYTHON-5040 Remove cRLSign from CA keyUsage to fix macOS CERT_SUSPENDED
blink1073 9e070b4
PYTHON-5040 Use cryptography library to generate certs with AKI but n…
blink1073 35d9660
PYTHON-5040 Add OCSPNoCheck to leaf certs and fix CA basicConstraints…
blink1073 aa6ecaa
PYTHON-5040 Switch AKI to issuer form and add CA keyUsage
blink1073 8aed47c
PYTHON-5040 Use self-generated Drivers Testing CA and separate KMS se…
blink1073 a163db5
PYTHON-5040 Disable TLS revocation check on macOS for SSL tests
blink1073 b4418cf
PYTHON-5040 Use keyid-form AKI for Python 3.14 compatibility
blink1073 628d1ce
PYTHON-5040 Fix CSFLE_TLS_CERT_FILE to use server-kms.pem
blink1073 f043fbd
PYTHON-5040 Make CA basicConstraints critical, regenerate certs
blink1073 62bc84f
PYTHON-5040 Add keyUsage to CA cert, regenerate certs
blink1073 0e8e7de
PYTHON-5040 Add SKI to KMS leaf certs, remove from CA
blink1073 3d56e35
PYTHON-5040 Use PROTOCOL_TLS_CLIENT in http_post for Python 3.14
blink1073 061b94d
PYTHON-5040 Update README and add run_server.py comment
blink1073 7bd8417
PYTHON-5040 Fix mypy typing errors in synchro.py and gen-certs.py
blink1073 977db57
PYTHON-5040 Clarify comments about macOS SecTrust and cert env vars
blink1073 c8a4a94
PYTHON-5040 Only use PROTOCOL_TLS_CLIENT in http_post on macOS
blink1073 9f61537
PYTHON-5040 Use uv run with PEP 723 inline metadata in gen-certs.py
blink1073 75e49b3
PYTHON-5040 Fix Windows KMS cert failures: issuer-form AKI, win32 guard
blink1073 75bf0e4
PYTHON-5040 Define AKI/SKI on first use, pin cryptography>=44.0.0
blink1073 febdef9
PYTHON-5040 Remove keyUsage from CA cert to fix Windows signature fai…
blink1073 b0219c1
PYTHON-5040 Switch to upstream drivers-evergreen-tools now that PR #7…
blink1073 afc448e
PYTHON-5040 Use create_default_context and clear X509_STRICT flag on …
blink1073 85c1802
PYTHON-5040 Update certificates README for keyUsage removal and VERIF…
blink1073 3d4fdb4
PYTHON-5040 Remove --tls-allow-invalid-certificates; update README wi…
blink1073 8442cec
PYTHON-5040 Rename KMS certs with kms- prefix for clarity
blink1073 3603e52
PYTHON-5040 Clarify that X509_V_FLAG_X509_STRICT is an OpenSSL flag s…
blink1073 f3f4d8b
PYTHON-5040 Add CA SKI, keyid-form AKI for KMS certs, restore macOS t…
blink1073 f95c1d4
PYTHON-5040 Add keyUsage to CA cert for Python 3.14 strict mode
blink1073 4abec61
PYTHON-5040 Trim gen-certs.py comments; refer to README for background
blink1073 4d24b1e
PYTHON-5040 Trim gen-certs.py and README for conciseness
blink1073 ebb90a4
PYTHON-5040 Define AKI and SKI in README Certificate details section
blink1073 1cef786
PYTHON-5040 Expand SANs acronym in CONTRIBUTING.md
blink1073 60e0ccd
PYTHON-5040 Clarify 'The generated MongoDB certs' in README Background
blink1073 e80fe4e
PYTHON-5040 Trim run_server.py macOS comment; refer to README
blink1073 f9c4639
PYTHON-5040 Extract CA_KEY_USAGE constant; simplify ca_errors tracking
blink1073 9dbf604
PYTHON-5040 Refactor gen-certs.py into functions with a main() entry …
blink1073 7e7542d
PYTHON-5040 gen_ca returns only ca_key; cert is unused by caller
blink1073 656864f
PYTHON-5040 Merge upstream/master
blink1073 dd24728
PYTHON-5040 Fix ruff-format: add blank line after module docstring
blink1073 3783d28
PYTHON-5040 Restore CERT_NONE for KMS failpoint server connection
blink1073 d18de55
PYTHON-5040 Explain why CERT_NONE is needed for failpoint server; dro…
blink1073 9b9afb0
PYTHON-5040 Point KMS failpoint server at our regenerated test certs
blink1073 a0dc629
Merge remote-tracking branch 'upstream/master' into PYTHON-5040
blink1073 f4eb63f
Add openssl cli to listed dependencies
blink1073 a44fe53
PYTHON-5040 Revert drivers-evergreen-tools checkout to mongodb-labs/m…
blink1073 bdb3d19
Merge remote-tracking branch 'origin/PYTHON-5040' into PYTHON-5040
blink1073 07d4bb8
Merge remote-tracking branch 'upstream/main' into PYTHON-5040
blink1073 789b8aa
PYTHON-5040 Fix repo_root typo in CONTRIBUTING.md
blink1073 0f5338c
Merge branch 'main' into PYTHON-5040
blink1073 aeee11c
PYTHON-5040 Remove "via" from PR comments/docs
blink1073 fbb4cfe
PYTHON-5040 Verify trusted-ca.pem extensions; clarify strict-mode wor…
blink1073 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
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
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
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
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
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
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
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,83 @@ | ||
| # Test TLS Certificates | ||
|
|
||
| These certificates are used by the PyMongo test suite for TLS/SSL integration tests. | ||
|
|
||
| ## Regenerating certificates | ||
|
|
||
| Run the generation script from this directory: | ||
|
|
||
| ```bash | ||
| uv run gen-certs.py | ||
| ``` | ||
|
|
||
| **Prerequisites:** Python 3 and [uv](https://docs.astral.sh/uv/). The script declares its own dependency on `cryptography` via PEP 723 inline metadata, so `uv` installs it automatically. | ||
|
blink1073 marked this conversation as resolved.
Outdated
|
||
|
|
||
| ## Certificate details | ||
|
|
||
| Two classes of leaf certificate are generated, with different extension profiles to satisfy | ||
| conflicting requirements from Python's ssl module and macOS's SecTrust framework. | ||
| AKI (Authority Key Identifier) and SKI (Subject Key Identifier) are X.509 extensions that | ||
| identify the key used to sign a certificate and the certificate's own key, respectively. | ||
|
|
||
| **MongoDB certs** — presented to MongoDB Enterprise, verified by Apple SecTrust on macOS. | ||
| No AKI or SKI. Adding AKI triggers SecTrust OCSP checks; our CA has no OCSP responder, so those | ||
| fail with `CSSMERR_TP_CERT_SUSPENDED`. See Background below. | ||
|
|
||
| **KMS certs** — presented by KMS mock servers, verified by Python's ssl module (OpenSSL). | ||
| Carry both AKI (keyid form) and SKI. Python 3.13 requires AKI on non-root certs; Python 3.14 | ||
| sets `X509_V_FLAG_X509_STRICT` in `ssl.create_default_context()`, which additionally requires SKI | ||
| and critical `keyUsage` on CA certs. | ||
|
|
||
| | File | Subject | Signed by | Extensions | Purpose | | ||
| |---|---|---|---|---| | ||
| | `ca.pem` | `CN=Drivers Testing CA, ...` | Self (CA) | basicConstraints critical, keyUsage critical, SKI | Root CA for all test certs | | ||
| | `server.pem` | `CN=localhost, ...` + SAN | Drivers Testing CA | SAN only | MongoDB server cert (key + cert) | | ||
| | `client.pem` | `CN=client, O=MDB, ...` | Drivers Testing CA | keyUsage, extKeyUsage | Client auth cert (key + cert) | | ||
| | `password_protected.pem` | Same as client | Drivers Testing CA | keyUsage, extKeyUsage | Client cert with AES-256 encrypted key | | ||
| | `crl.pem` | — | Drivers Testing CA | — | CRL revoking serial 1 (server.pem) | | ||
| | `kms-server.pem` | `CN=localhost, ...` + SAN | Drivers Testing CA | SAN, AKI, SKI | KMS mock server cert (key + cert) | | ||
| | `kms-wrong-host.pem` | `CN=wronghost.example.com` | Drivers Testing CA | SAN, AKI, SKI | KMS wrong-host test cert | | ||
| | `kms-expired.pem` | `CN=localhost, ...` + SAN | Drivers Testing CA | SAN, AKI, SKI | KMS expired cert (validity 2000–2001) | | ||
| | `trusted-ca.pem` | `CN=Trusted Kernel Test CA, ...` | Self (CA) | basicConstraints critical, keyUsage critical | Separate CA for CA-bundle tests | | ||
|
|
||
| **Password** for `password_protected.pem`: `qwerty` | ||
|
|
||
| ## Important constraints | ||
|
|
||
| The following values are hardcoded in tests and **must not change**: | ||
|
|
||
| - Client cert subject: `C=US,ST=New York,L=New York City,O=MDB,OU=Drivers,CN=client` | ||
| (used as the MongoDB X.509 username in `test/test_ssl.py`) | ||
| - Server cert SAN: `DNS:localhost, IP:127.0.0.1, IP:::1` | ||
| - The `server` hostname alias for `127.0.0.1` must be present in `/etc/hosts` for SSL tests to pass | ||
| (added automatically by `.evergreen/scripts/setup-system.sh`) | ||
|
|
||
| ## Background | ||
|
|
||
| Certificates were regenerated for PYTHON-5040 to fix `ssl.SSLCertVerificationError` failures on | ||
| macOS and Windows with Python 3.13+. The root causes were: | ||
|
|
||
| 1. Python 3.13 enables `X509_V_FLAG_X509_STRICT` in `ssl.create_default_context()`, which | ||
| requires **AKI** on non-root certs. The KMS mock-server connection (`http_post`) used | ||
| `create_default_context()`, so the original 2019 KMS certs (no AKI) started failing. | ||
| 2. Python 3.14 sets `ssl.VERIFY_X509_STRICT` (OpenSSL's `X509_V_FLAG_X509_STRICT`) in | ||
| `ssl.create_default_context()`, which additionally requires **SKI** on non-root certs and | ||
| **keyUsage** on CA certs. | ||
|
|
||
| The generated MongoDB certs carry no AKI: AKI on any leaf cert triggers Apple SecTrust OCSP checks, which fail | ||
| (`CSSMERR_TP_CERT_SUSPENDED`) because our CA has no OCSP responder. MongoDB Enterprise on macOS | ||
| uses `kSecRevocationRequirePositiveResponse`, so even without AKI the server startup fails; that is | ||
| why `.evergreen/scripts/run_server.py` passes `--tls-allow-invalid-certificates` on macOS. The CA | ||
| carries SKI (but no AKI), which enables keyid-form AKI on KMS leaf certs without re-triggering | ||
| macOS OCSP. As long as `pymongo.ssl_support.get_ssl_context` uses `PROTOCOL_SSLv23` (not | ||
| `create_default_context`), `X509_V_FLAG_X509_STRICT` is not set and no AKI is required on MongoDB | ||
| leaf certs. | ||
|
|
||
| KMS connections use `ssl.create_default_context()`, which sets `X509_V_FLAG_X509_STRICT`. | ||
| OpenSSL 3.3+ strict mode requires the `keyIdentifier` field within AKI; issuer/serial form is not | ||
| sufficient, so KMS leaf certs use keyid-form AKI derived from the CA's SKI. | ||
|
|
||
| > **If the driver is changed to use `ssl.create_default_context()` for MongoDB connections**, the | ||
| > MongoDB certs will need AKI and SKI. Adding AKI will re-trigger macOS SecTrust OCSP failures; | ||
| > to resolve that, either add `--tls-allow-invalid-certificates` to the server startup in | ||
| > `run_server.py`, or install the test CA into the macOS system keychain in the CI setup. | ||
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,21 +1,22 @@ | ||
| -----BEGIN CERTIFICATE----- | ||
| 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 | ||
| -----END CERTIFICATE----- |
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,48 +1,48 @@ | ||
| -----BEGIN RSA PRIVATE KEY----- | ||
| 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 | ||
| -----END RSA PRIVATE KEY----- | ||
| -----BEGIN CERTIFICATE----- | ||
| MIIDgzCCAmugAwIBAgIDAxOUMA0GCSqGSIb3DQEBCwUAMHkxGzAZBgNVBAMTEkRy | ||
| aXZlcnMgVGVzdGluZyBDQTEQMA4GA1UECxMHRHJpdmVyczEQMA4GA1UEChMHTW9u | ||
| Z29EQjEWMBQGA1UEBxMNTmV3IFlvcmsgQ2l0eTERMA8GA1UECBMITmV3IFlvcmsx | ||
| CzAJBgNVBAYTAlVTMB4XDTE5MDUyMjIzNTU1NFoXDTM5MDUyMjIzNTU1NFowaTEP | ||
| MA0GA1UEAxMGY2xpZW50MRAwDgYDVQQLEwdEcml2ZXJzMQwwCgYDVQQKEwNNREIx | ||
| FjAUBgNVBAcTDU5ldyBZb3JrIENpdHkxETAPBgNVBAgTCE5ldyBZb3JrMQswCQYD | ||
| VQQGEwJVUzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALDUvFBLop+/ | ||
| ytvY13yDi6SKIdYxMllasYontjp8e7iSSnKCqJIQN13lJ1TdJOl+TMGFnDedsXJ7 | ||
| Oy2LcrdOp0aUxtv3pqFeOMPbik7h7L1G4jsElZv06CkEOBVBWaKqK1x/mZibiKST | ||
| X6FvtwpBNbxAwiHnCKugTYOckrD7b0rkiRxo6ZnO/+WVA7xRNmifEGyVN1rNB14h | ||
| G+spotOPC5cxC9lSl98Opqqofu3XGRgMu6mJNuRWfZLSrwnkGru5k8lNYbD6yhYi | ||
| rTDfENmQCLV9d2rMOfyHkk6ti4CxR5W4+SqauBpi3TQrIcx+V+xMNyGDPBB5rF/H | ||
| Zg+pob+76VcCAwEAAaMkMCIwCwYDVR0PBAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUF | ||
| BwMCMA0GCSqGSIb3DQEBCwUAA4IBAQAqRcLAGvYMaGYOV4HJTzNotT2qE0I9THNQ | ||
| wOV1fBg69x6SrUQTQLjJEptpOA288Wue6Jt3H+p5qAGV5GbXjzN/yjCoItggSKxG | ||
| Xg7279nz6/C5faoIKRjpS9R+MsJGlttP9nUzdSxrHvvqm62OuSVFjjETxD39DupE | ||
| YPFQoHOxdFTtBQlc/zIKxVdd20rs1xJeeU2/L7jtRBSPuR/Sk8zot7G2/dQHX49y | ||
| kHrq8qz12kj1T6XDXf8KZawFywXaz0/Ur+fUYKmkVk1T0JZaNtF4sKqDeNE4zcns | ||
| p3xLVDSl1Q5Gwj7bgph9o4Hxs9izPwiqjmNaSjPimGYZ399zcurY | ||
| MIIDgTCCAmmgAwIBAgIBAjANBgkqhkiG9w0BAQsFADB5MRswGQYDVQQDDBJEcml2 | ||
| ZXJzIFRlc3RpbmcgQ0ExEDAOBgNVBAsMB0RyaXZlcnMxEDAOBgNVBAoMB01vbmdv | ||
| REIxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxETAPBgNVBAgMCE5ldyBZb3JrMQsw | ||
| CQYDVQQGEwJVUzAeFw0yNjA2MTQxNTExNTlaFw00NjA2MTAxNTExNTlaMGkxDzAN | ||
| BgNVBAMMBmNsaWVudDEQMA4GA1UECwwHRHJpdmVyczEMMAoGA1UECgwDTURCMRYw | ||
| FAYDVQQHDA1OZXcgWW9yayBDaXR5MREwDwYDVQQIDAhOZXcgWW9yazELMAkGA1UE | ||
| BhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC/bs4sKJnvEjlx | ||
| SzUqaP5BBZwrLCllfR0u1W8aPc4u13tRtPd8hamcuyZJc6T781EEV08uAZSerxAF | ||
| S4msHf5MPyVvXmg/IS5R923IdBuwGQR01vMdLZ2PLfcFiAKiW3wQ3+sa04Mwy0Gf | ||
| pWVv3Mu4mLgXmJfNLgByR0HPGL+0Ws4/3s28rFUUZ5sm8yHDpBFavxJH1oTHxxzh | ||
| NAIIqXLYy/ZZRUt5fouwH25y9mEys3UFn18uIEFMJNfM1BgZbaxyl5wN9rQLPd4m | ||
| cCWJmtaENMRkIPYzMOGjNH4mWnJ8ltxoF16RI0xnLQIalRUPdoYCEdisqskxtlZf | ||
| HPm3r5AZAgMBAAGjJDAiMAsGA1UdDwQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcD | ||
| AjANBgkqhkiG9w0BAQsFAAOCAQEALhvRiiV/C5uAt7xmyMalHuQqBhR67gA55jBb | ||
| faIKSnhEBcWaOAx+2PiHMRhI4BraOxDT2IIjar1vL/Lp4QB81RIfBTjefVgldGOD | ||
| FjvyU2PrBLoeVLOsrtYdjyjwciXrErYRKyOx9B+cBm5hUKA2kTnJz8ad+01Qquw5 | ||
| s+e8rzVRL4Brrc3L2F0MURrx6H3VPwXSbVk8hFc4qSBf1WHSULkjVD/QP0uitwH4 | ||
| qKCRhq/h9m43IPRE+rLseldJhAWvlqMNxyJLoSOLgOfUd0iXV8pGqN+OOx4OJGPS | ||
| g4ry+fZLqf+k6Du7pfrdlv3VOwC4tylSsl0EyzlLqDtXO20G9A== | ||
| -----END CERTIFICATE----- |
Oops, something went wrong.
Oops, something went wrong.
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.
Uh oh!
There was an error while loading. Please reload this page.