Package: python3-trustme
Version: 1.2.0-0.1
Severity: serious
Tags: patch
Control: affects -1 src:python-cheroot
python-cheroot FTBFSes in unstable for a couple of reasons at the
moment, but one of them is that the latest python3-openssl has caused
DeprecationWarnings to show up via python3-trustme. This manifests as
something like this:
_________________________________________________________________________
test_ssl_adapters[pyopenssl]
_________________________________________________________________________
[gw4] linux -- Python 3.13.1 /usr/bin/python3.13
http_request_timeout = 0.1
tls_http_server = functools.partial(<function make_tls_http_server at
0x7fba15dcc180>, request=<SubRequest 'tls_http_server' for <Function
test_ssl_adapters[pyopenssl]>>)
adapter_type = 'pyopenssl', tls_certificate = <trustme.LeafCert object at
0x7fba159274d0>, tls_certificate_chain_pem_path = '/tmp/tmprthmjb0j.pem'
tls_certificate_private_key_pem_path = '/tmp/tmphcv6h1pr.pem',
tls_ca_certificate_pem_path = '/tmp/tmp63qa09j0.pem'
@pytest.mark.parametrize(
'adapter_type',
(
'builtin',
'pyopenssl',
),
)
def test_ssl_adapters(
http_request_timeout,
tls_http_server, adapter_type,
tls_certificate,
tls_certificate_chain_pem_path,
tls_certificate_private_key_pem_path,
tls_ca_certificate_pem_path,
):
"""Test ability to connect to server via HTTPS using adapters."""
interface, _host, port = _get_conn_data(ANY_INTERFACE_IPV4)
tls_adapter_cls = get_ssl_adapter_class(name=adapter_type)
tls_adapter = tls_adapter_cls(
tls_certificate_chain_pem_path,
tls_certificate_private_key_pem_path,
)
if adapter_type == 'pyopenssl':
tls_adapter.context = tls_adapter.get_context()
> tls_certificate.configure_cert(tls_adapter.context)
_host = '0.0.0.0'
adapter_type = 'pyopenssl'
http_request_timeout = 0.1
interface = '127.0.0.1'
port = 0
tls_adapter = <cheroot.ssl.pyopenssl.pyOpenSSLAdapter object at
0x7fba15cbfcb0>
tls_adapter_cls = <class 'cheroot.ssl.pyopenssl.pyOpenSSLAdapter'>
tls_ca_certificate_pem_path = '/tmp/tmp63qa09j0.pem'
tls_certificate = <trustme.LeafCert object at 0x7fba159274d0>
tls_certificate_chain_pem_path = '/tmp/tmprthmjb0j.pem'
tls_certificate_private_key_pem_path = '/tmp/tmphcv6h1pr.pem'
tls_http_server = functools.partial(<function make_tls_http_server at
0x7fba15dcc180>, request=<SubRequest 'tls_http_server' for <Function
test_ssl_adapters[pyopenssl]>>)
cheroot/test/test_ssl.py:212:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/trustme/__init__.py:553: in configure_cert
ctx.use_certificate(cert)
FILETYPE_PEM = 1
cert = <OpenSSL.crypto.X509 object at 0x7fba15cbdbe0>
ctx = <OpenSSL.SSL.Context object at 0x7fba15cbe660>
key =
<cryptography.hazmat.bindings._rust.openssl.ec.ECPrivateKey object at
0x7fba140bcb10>
load_certificate = <function load_certificate at 0x7fba15d82ca0>
self = <trustme.LeafCert object at 0x7fba159274d0>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _
self = <OpenSSL.SSL.Context object at 0x7fba15cbe660>, cert =
<OpenSSL.crypto.X509 object at 0x7fba15cbdbe0>
def use_certificate(self, cert: X509 | x509.Certificate) -> None:
"""
Load a certificate from a X509 object
:param cert: The X509 object
:return: None
"""
# Mirrored at Connection.use_certificate
if not isinstance(cert, X509):
cert = X509.from_cryptography(cert)
else:
> warnings.warn(
(
"Passing pyOpenSSL X509 objects is deprecated. You "
"should use a cryptography.x509.Certificate instead."
),
DeprecationWarning,
stacklevel=2,
)
E DeprecationWarning: Passing pyOpenSSL X509 objects is deprecated.
You should use a cryptography.x509.Certificate instead.
cert = <OpenSSL.crypto.X509 object at 0x7fba15cbdbe0>
self = <OpenSSL.SSL.Context object at 0x7fba15cbe660>
/usr/lib/python3/dist-packages/OpenSSL/SSL.py:1140: DeprecationWarning
(This also shows up as warnings when building python-trustme, but they
don't cause failures in that context.)
The attached patch is cherry-picked from upstream and fixes this. If
you're still busy, would you like me to NMU again?
Thanks,
--
Colin Watson (he/him) [[email protected]]
diff -Nru python-trustme-1.2.0/debian/changelog
python-trustme-1.2.0/debian/changelog
--- python-trustme-1.2.0/debian/changelog 2024-11-19 20:22:45.000000000
+0000
+++ python-trustme-1.2.0/debian/changelog 2024-12-10 19:31:04.000000000
+0000
@@ -1,3 +1,10 @@
+python-trustme (1.2.0-0.2) UNRELEASED; urgency=medium
+
+ * Non-maintainer upload.
+ * Use cryptography to load the pyOpenSSL certificates.
+
+ -- Colin Watson <[email protected]> Tue, 10 Dec 2024 19:31:04 +0000
+
python-trustme (1.2.0-0.1) unstable; urgency=medium
* Non-maintainer upload with maintainer's permission.
diff -Nru python-trustme-1.2.0/debian/patches/pyOpenSSL-cryptography.patch
python-trustme-1.2.0/debian/patches/pyOpenSSL-cryptography.patch
--- python-trustme-1.2.0/debian/patches/pyOpenSSL-cryptography.patch
1970-01-01 01:00:00.000000000 +0100
+++ python-trustme-1.2.0/debian/patches/pyOpenSSL-cryptography.patch
2024-12-10 19:31:04.000000000 +0000
@@ -0,0 +1,40 @@
+Description: Use cryptography to load the pyOpenSSL certificates
+Origin: backport, https://github.com/python-trio/trustme/pull/670
+Author: EXPLOSION <[email protected]>
+Last-Update: 2024-12-10
+
+Index: b/src/trustme/__init__.py
+===================================================================
+--- a/src/trustme/__init__.py
++++ b/src/trustme/__init__.py
+@@ -8,7 +8,7 @@
+ from contextlib import contextmanager
+ from enum import Enum
+ from tempfile import NamedTemporaryFile
+-from typing import TYPE_CHECKING, Generator, List, Optional, Union
++from typing import TYPE_CHECKING, Generator, List, Optional, Union, cast
+
+ import idna
+ from cryptography import x509
+@@ -545,15 +545,13 @@
+ with self.private_key_and_cert_chain_pem.tempfile() as path:
+ ctx.load_cert_chain(path)
+ elif _smells_like_pyopenssl(ctx):
+- from OpenSSL.crypto import FILETYPE_PEM, load_certificate,
load_privatekey
+-
+- key = load_privatekey(FILETYPE_PEM, self.private_key_pem.bytes())
+- ctx.use_privatekey(key)
+- cert = load_certificate(FILETYPE_PEM,
self.cert_chain_pems[0].bytes())
+- ctx.use_certificate(cert)
++ key = load_pem_private_key(self.private_key_pem.bytes(), None)
++ ctx.use_privatekey(key) # type: ignore[arg-type]
++ cert =
x509.load_pem_x509_certificate(self.cert_chain_pems[0].bytes())
++ ctx.use_certificate(cert) # type: ignore[arg-type]
+ for pem in self.cert_chain_pems[1:]:
+- cert = load_certificate(FILETYPE_PEM, pem.bytes())
+- ctx.add_extra_chain_cert(cert)
++ cert = x509.load_pem_x509_certificate(pem.bytes())
++ ctx.add_extra_chain_cert(cert) # type: ignore[arg-type]
+ else:
+ raise TypeError(
+ "unrecognized context type
{!r}".format(ctx.__class__.__name__)
diff -Nru python-trustme-1.2.0/debian/patches/series
python-trustme-1.2.0/debian/patches/series
--- python-trustme-1.2.0/debian/patches/series 1970-01-01 01:00:00.000000000
+0100
+++ python-trustme-1.2.0/debian/patches/series 2024-12-10 19:28:33.000000000
+0000
@@ -0,0 +1 @@
+pyOpenSSL-cryptography.patch