gh-146207: Add support for OpenSSL 4.0.0 alpha1#146217
Conversation
OpenSSL 4.0.0 alpha1 no longer defines the symbols: * SSLv3_method * TLSv1_method * TLSv1_1_method * TLSv1_2_method
|
I didn't test my own change on OpenSSL 4.0.0 alpha1, I only asked @heitbaum to test my change. |
|
@vstinner This patch (should, probably :) ) be enough to get you a test in CI, even if we don't want to merge it yet: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 2fa2ab768dc..40feaef01ce 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -275,6 +275,7 @@ jobs:
- { name: openssl, version: 3.4.4 }
- { name: openssl, version: 3.5.5 }
- { name: openssl, version: 3.6.1 }
+ - { name: openssl, version: 4.0.0-alpha1 }
## AWS-LC
- { name: aws-lc, version: 1.68.0 }
env: |
|
I applied @zware's patch: Tests / Ubuntu SSL tests (ubuntu-24.04, openssl, 4.0.0-alpha1) job is currently running.
Yeah, I will revert this patch once we get the openssl, 4.0.0-alpha1 CI job result. |
|
Not as simple as hoped :(. I can reproduce the CI failure locally, though; there's a missing symlink (or With that, I get these failures: 2 tests failed:
test_ssl test_urllib2_localnet
43 tests OK.
0:00:23 load avg: 3.07 Re-running 2 failed tests in verbose mode in subprocesses
0:00:23 load avg: 3.07 Run 2 tests in parallel using 2 worker processes
0:00:24 load avg: 3.07 [1/2/1] test_ssl failed (1 failure)
Re-running test_ssl in verbose mode (matching: test_openssl_version)
test_ssl: testing with 'OpenSSL 4.0.0-alpha1 10 Mar 2026' (4, 0, 0, 0, 0)
under 'Linux-6.19.7-200.fc43.x86_64-x86_64-with-glibc2.42'
HAS_SNI = True
OP_ALL = 0x80000050
OP_NO_TLSv1_1 = 0x10000000
test_openssl_version (test.test_ssl.BasicSocketTests.test_openssl_version) ... FAIL
======================================================================
FAIL: test_openssl_version (test.test_ssl.BasicSocketTests.test_openssl_version)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/path/to/cpython/bump_multissl_awslc/Lib/test/test_ssl.py", line 590, in test_openssl_version
self.assertLess(n, 0x40000000)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
AssertionError: 1073741824 not less than 1073741824
----------------------------------------------------------------------
Ran 1 test in 0.007s
FAILED (failures=1)
test test_ssl failed
0:00:24 load avg: 3.07 [2/2/2] test_urllib2_localnet failed (2 errors)
Re-running test_urllib2_localnet in verbose mode (matching: test_https, test_https_sni)
test_https (test.test_urllib2_localnet.TestUrlopen.test_https) ... ERROR
stopping HTTPS server
joining HTTPS thread
test_https_sni (test.test_urllib2_localnet.TestUrlopen.test_https_sni) ... ERROR
stopping HTTPS server
joining HTTPS thread
======================================================================
ERROR: test_https (test.test_urllib2_localnet.TestUrlopen.test_https)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/path/to/cpython/bump_multissl_awslc/Lib/test/test_urllib2_localnet.py", line 569, in test_https
data = self.urlopen("https://localhost:%s/bizarre" % handler.port, context=context)
File "/path/to/cpython/bump_multissl_awslc/Lib/test/test_urllib2_localnet.py", line 473, in urlopen
l.extend(f.readlines(200))
~~~~~~~~~~~^^^^^
File "/path/to/cpython/bump_multissl_awslc/Lib/http/client.py", line 714, in readline
result = self.fp.readline(limit)
File "/path/to/cpython/bump_multissl_awslc/Lib/socket.py", line 734, in readinto
return self._sock.recv_into(b)
~~~~~~~~~~~~~~~~~~~~^^^
File "/path/to/cpython/bump_multissl_awslc/Lib/ssl.py", line 1355, in recv_into
return self.read(nbytes, buffer)
~~~~~~~~~^^^^^^^^^^^^^^^^
File "/path/to/cpython/bump_multissl_awslc/Lib/ssl.py", line 1154, in read
return self._sslobj.read(len, buffer)
~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
ssl.SSLError: A failure in the SSL library occurred (_ssl.c:2977)
======================================================================
ERROR: test_https_sni (test.test_urllib2_localnet.TestUrlopen.test_https_sni)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/path/to/cpython/bump_multissl_awslc/Lib/test/test_urllib2_localnet.py", line 585, in test_https_sni
self.urlopen("https://localhost:%s" % handler.port, context=context)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/path/to/cpython/bump_multissl_awslc/Lib/test/test_urllib2_localnet.py", line 473, in urlopen
l.extend(f.readlines(200))
~~~~~~~~~~~^^^^^
File "/path/to/cpython/bump_multissl_awslc/Lib/http/client.py", line 714, in readline
result = self.fp.readline(limit)
File "/path/to/cpython/bump_multissl_awslc/Lib/socket.py", line 734, in readinto
return self._sock.recv_into(b)
~~~~~~~~~~~~~~~~~~~~^^^
File "/path/to/cpython/bump_multissl_awslc/Lib/ssl.py", line 1355, in recv_into
return self.read(nbytes, buffer)
~~~~~~~~~^^^^^^^^^^^^^^^^
File "/path/to/cpython/bump_multissl_awslc/Lib/ssl.py", line 1154, in read
return self._sslobj.read(len, buffer)
~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
ssl.SSLError: A failure in the SSL library occurred (_ssl.c:2977)
----------------------------------------------------------------------
Ran 2 tests in 0.122s
FAILED (errors=2)
test test_urllib2_localnet failed
2 tests failed again:
test_ssl test_urllib2_localnet |
|
I tested I fixed a few more issues, but |
I fixed that with a5152be. |
|
Tested results in #146207 (comment) |
This reverts commit 5f9bc31.
|
@picnixz @gpshead @zware: Would you mind to review this change? I reverted the change to run "Tests / Ubuntu SSL tests (ubuntu-24.04, openssl, 4.0.0-alpha1)" CI job. I don't think that we should test alpha versions in our CI. There are still two Also, I think that we should backport the change to Python 3.13 and 3.14 to also prepare these branches to OpenSSL 4. |
|
I am not very fond of adding support in stable branches for an alpha version for now as I do not know if/how the ABI could change. I do not mind having a presupport in 3.15 so that we can get feedback during our beta but I will take a look at what is planned in OpenSSL once I am at home. |
|
Thanks @vstinner for the PR 🌮🎉.. I'm working now to backport this PR to: 3.13, 3.14. |
OpenSSL 4.0.0 alpha1 removed these functions: * SSLv3_method() * TLSv1_method() * TLSv1_1_method() * TLSv1_2_method() Other changes: * Update test_openssl_version(). * Update multissltests.py for OpenSSL 4. * Add const qualifier to fix compiler warnings. (cherry picked from commit 3364e7e) Co-authored-by: Victor Stinner <vstinner@python.org> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
|
GH-146403 is a backport of this pull request to the 3.14 branch. |
OpenSSL 4.0.0 alpha1 removed these functions: * SSLv3_method() * TLSv1_method() * TLSv1_1_method() * TLSv1_2_method() Other changes: * Update test_openssl_version(). * Update multissltests.py for OpenSSL 4. * Add const qualifier to fix compiler warnings. (cherry picked from commit 3364e7e) Co-authored-by: Victor Stinner <vstinner@python.org> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
|
GH-146404 is a backport of this pull request to the 3.13 branch. |
|
I merged my PR. Thanks for reviews.
Oops, I forgot to remove "backport" labels. I closed the 3.13 and 3.14 backport PRs (without merging them). |
|
Oh, I understood the OPENSSL_sk_set_thunks symbol error: |
|
See also #148292 for |
|
I don't want to backport anything until we fixed the tests. I also don't want to backport anything until we have more feedback from the 3.15's beta. We can always backport OSSL 4.x support later for 3.13 and 3.14. |
OpenSSL 4.0.0 alpha1 removed these functions: * SSLv3_method() * TLSv1_method() * TLSv1_1_method() * TLSv1_2_method() Other changes: * Update test_openssl_version(). * Update multissltests.py for OpenSSL 4. * Add const qualifier to fix compiler warnings. Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
OpenSSL 4.0.0 alpha1 removed these functions: * SSLv3_method() * TLSv1_method() * TLSv1_1_method() * TLSv1_2_method() Other changes: * Update test_openssl_version(). * Update multissltests.py for OpenSSL 4. * Add const qualifier to fix compiler warnings. Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
OpenSSL 4.0.0 alpha1 removed these functions: * SSLv3_method() * TLSv1_method() * TLSv1_1_method() * TLSv1_2_method() Other changes: * Update test_openssl_version(). * Update multissltests.py for OpenSSL 4. * Add const qualifier to fix compiler warnings. Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
The default Python stack in Fedora Rawhide was updated from version 3.14
to 3.15 [1], and OpenSSL 4.0 was introduced [2]. As a result of this
combination, the PROTOCOL_TLSv1 attribute disappeared from Python's ssl
module [3]. This prevents Zuul from working with Fedora Rawhide hosts,
because of this Ansible error:
TASK [add-build-sshkey : Enable access via build key on all nodes] ***
An exception occurred during task execution. To see the full
traceback, use -vvv.
The error was: AttributeError: module 'ssl' has no attribute
'PROTOCOL_TLSv1'. Did you mean '.PROTOCOL_TLS' instead of
'.PROTOCOL_TLSv1'?
The use of ssl.PROTOCOL_TLSv1 was removed from ansible-core 2.17.0 [4],
which became available in Ansible 10 [5]; and since Zuul 13.0.0, the
default Ansible version is 9, and version 11 can be optionally used.
Therefore, explicitly selecting Ansible 11 resolves this breakage when
the combination of Python 3.15 and OpenSSL 4.0 are used.
[1] https://fedoraproject.org/wiki/Changes/Python3.15
[2] https://fedoraproject.org/wiki/Changes/OpenSSL40
[3] CPython commit 3364e7e62fa24d0e
python/cpython@3364e7e62fa24d0e
python/cpython#146217
python/cpython#146207
[4] ansible-core commit 92d2c66db2eecd0f
ansible/ansible@92d2c66db2eecd0f
ansible/ansible#81880
[5] https://github.com/ansible-community/ansible-build-data/blob/main/10/CHANGELOG-v10.md
[6] https://zuul-ci.org/docs/zuul/latest/releasenotes.html
containers#1824
Signed-off-by: Tristan Cacqueray <tdecacqu@redhat.com>
The default Python stack in Fedora Rawhide was updated from version 3.14
to 3.15 [1], and OpenSSL 4.0 was introduced [2]. As a result of this
combination, the PROTOCOL_TLSv1 attribute disappeared from Python's ssl
module [3]. This prevents Zuul from working with Fedora Rawhide hosts,
because of this Ansible error:
TASK [add-build-sshkey : Enable access via build key on all nodes] ***
An exception occurred during task execution. To see the full
traceback, use -vvv.
The error was: AttributeError: module 'ssl' has no attribute
'PROTOCOL_TLSv1'. Did you mean '.PROTOCOL_TLS' instead of
'.PROTOCOL_TLSv1'?
The use of ssl.PROTOCOL_TLSv1 was removed from ansible-core 2.17.0 [4],
which became available in Ansible 10 [5,6]; and since Zuul 13.0.0, the
default Ansible version is 9, and version 11 can be optionally used [7].
Therefore, explicitly selecting Ansible 11 resolves this breakage when
the combination of Python 3.15 and OpenSSL 4.0 are used.
[1] https://fedoraproject.org/wiki/Changes/Python3.15
[2] https://fedoraproject.org/wiki/Changes/OpenSSL40
[3] CPython commit 3364e7e62fa24d0e
python/cpython@3364e7e62fa24d0e
python/cpython#146217
python/cpython#146207
[4] ansible-core commit 92d2c66db2eecd0f
ansible/ansible@92d2c66db2eecd0f
ansible/ansible#81880
[5] https://docs.ansible.com/projects/ansible/latest/reference_appendices/release_and_maintenance.html
[6] https://github.com/ansible-community/ansible-build-data/blob/main/10/CHANGELOG-v10.md
[7] https://zuul-ci.org/docs/zuul/latest/releasenotes.html
containers#1824
Signed-off-by: Tristan Cacqueray <tdecacqu@redhat.com>
OpenSSL 4.0.0 alpha1 no longer defines the symbols: