Skip to content

Commit 24cc2c1

Browse files
authored
Refactor two tests that rely on deprecated APIs (#1375)
1 parent a378d53 commit 24cc2c1

File tree

2 files changed

+118
-75
lines changed

2 files changed

+118
-75
lines changed

tests/test_crypto.py

Lines changed: 51 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2088,35 +2088,46 @@ def test_digest(self):
20882088
)
20892089
)
20902090

2091-
def _extcert(self, pkey, extensions):
2092-
cert = X509()
2093-
# Certificates with extensions must be X.509v3, which is encoded with a
2094-
# version of two.
2095-
cert.set_version(2)
2096-
cert.set_pubkey(pkey)
2097-
cert.get_subject().commonName = "Unit Tests"
2098-
cert.get_issuer().commonName = "Unit Tests"
2099-
when = datetime.now().strftime("%Y%m%d%H%M%SZ").encode("ascii")
2100-
cert.set_notBefore(when)
2101-
cert.set_notAfter(when)
2102-
2103-
cert.add_extensions(extensions)
2104-
cert.sign(pkey, "sha256")
2105-
return load_certificate(
2106-
FILETYPE_PEM, dump_certificate(FILETYPE_PEM, cert)
2091+
def _extcert(self, key, extensions):
2092+
subject = x509.Name(
2093+
[x509.NameAttribute(x509.NameOID.COMMON_NAME, "Unit Tests")]
21072094
)
2095+
when = datetime.now()
2096+
builder = (
2097+
x509.CertificateBuilder()
2098+
.public_key(key.public_key())
2099+
.subject_name(subject)
2100+
.issuer_name(subject)
2101+
.not_valid_before(when)
2102+
.not_valid_after(when)
2103+
.serial_number(1)
2104+
)
2105+
for i, ext in enumerate(extensions):
2106+
builder = builder.add_extension(ext, critical=i % 2 == 0)
2107+
2108+
return X509.from_cryptography(builder.sign(key, hashes.SHA256()))
21082109

21092110
def test_extension_count(self):
21102111
"""
21112112
`X509.get_extension_count` returns the number of extensions
21122113
that are present in the certificate.
21132114
"""
2114-
pkey = load_privatekey(FILETYPE_PEM, client_key_pem)
2115-
ca = X509Extension(b"basicConstraints", True, b"CA:FALSE")
2116-
key = X509Extension(b"keyUsage", True, b"digitalSignature")
2117-
subjectAltName = X509Extension(
2118-
b"subjectAltName", True, b"DNS:example.com"
2115+
pkey = load_privatekey(
2116+
FILETYPE_PEM, client_key_pem
2117+
).to_cryptography_key()
2118+
ca = x509.BasicConstraints(ca=False, path_length=None)
2119+
key = x509.KeyUsage(
2120+
digital_signature=True,
2121+
content_commitment=False,
2122+
key_encipherment=False,
2123+
data_encipherment=False,
2124+
key_agreement=False,
2125+
key_cert_sign=False,
2126+
crl_sign=False,
2127+
encipher_only=False,
2128+
decipher_only=False,
21192129
)
2130+
san = x509.SubjectAlternativeName([x509.DNSName("example.com")])
21202131

21212132
# Try a certificate with no extensions at all.
21222133
c = self._extcert(pkey, [])
@@ -2127,22 +2138,32 @@ def test_extension_count(self):
21272138
assert c.get_extension_count() == 1
21282139

21292140
# And a certificate with several
2130-
c = self._extcert(pkey, [ca, key, subjectAltName])
2141+
c = self._extcert(pkey, [ca, key, san])
21312142
assert c.get_extension_count() == 3
21322143

21332144
def test_get_extension(self):
21342145
"""
21352146
`X509.get_extension` takes an integer and returns an
21362147
`X509Extension` corresponding to the extension at that index.
21372148
"""
2138-
pkey = load_privatekey(FILETYPE_PEM, client_key_pem)
2139-
ca = X509Extension(b"basicConstraints", True, b"CA:FALSE")
2140-
key = X509Extension(b"keyUsage", True, b"digitalSignature")
2141-
subjectAltName = X509Extension(
2142-
b"subjectAltName", False, b"DNS:example.com"
2149+
pkey = load_privatekey(
2150+
FILETYPE_PEM, client_key_pem
2151+
).to_cryptography_key()
2152+
ca = x509.BasicConstraints(ca=False, path_length=None)
2153+
key = x509.KeyUsage(
2154+
digital_signature=True,
2155+
content_commitment=False,
2156+
key_encipherment=False,
2157+
data_encipherment=False,
2158+
key_agreement=False,
2159+
key_cert_sign=False,
2160+
crl_sign=False,
2161+
encipher_only=False,
2162+
decipher_only=False,
21432163
)
2164+
san = x509.SubjectAlternativeName([x509.DNSName("example.com")])
21442165

2145-
cert = self._extcert(pkey, [ca, key, subjectAltName])
2166+
cert = self._extcert(pkey, [ca, key, san])
21462167

21472168
ext = cert.get_extension(0)
21482169
assert isinstance(ext, X509Extension)
@@ -2151,12 +2172,12 @@ def test_get_extension(self):
21512172

21522173
ext = cert.get_extension(1)
21532174
assert isinstance(ext, X509Extension)
2154-
assert ext.get_critical()
2175+
assert not ext.get_critical()
21552176
assert ext.get_short_name() == b"keyUsage"
21562177

21572178
ext = cert.get_extension(2)
21582179
assert isinstance(ext, X509Extension)
2159-
assert not ext.get_critical()
2180+
assert ext.get_critical()
21602181
assert ext.get_short_name() == b"subjectAltName"
21612182

21622183
with pytest.raises(IndexError):

tests/test_ssl.py

Lines changed: 67 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,6 @@
5656
load_certificate,
5757
load_privatekey,
5858
)
59-
60-
with pytest.warns(DeprecationWarning):
61-
from OpenSSL.crypto import X509Extension
62-
6359
from OpenSSL.SSL import (
6460
DTLS_METHOD,
6561
MODE_RELEASE_BUFFERS,
@@ -248,55 +244,81 @@ def _create_certificate_chain():
248244
2. A new intermediate certificate signed by cacert (icert)
249245
3. A new server certificate signed by icert (scert)
250246
"""
251-
caext = X509Extension(b"basicConstraints", False, b"CA:true")
252-
not_after_date = datetime.date.today() + datetime.timedelta(days=365)
253-
not_after = not_after_date.strftime("%Y%m%d%H%M%SZ").encode("ascii")
247+
not_before = datetime.datetime(2000, 1, 1, 0, 0, 0)
248+
not_after = datetime.datetime.now() + datetime.timedelta(days=365)
254249

255250
# Step 1
256-
cakey = PKey()
257-
cakey.generate_key(TYPE_RSA, 2048)
258-
cacert = X509()
259-
cacert.set_version(2)
260-
cacert.get_subject().commonName = "Authority Certificate"
261-
cacert.set_issuer(cacert.get_subject())
262-
cacert.set_pubkey(cakey)
263-
cacert.set_notBefore(b"20000101000000Z")
264-
cacert.set_notAfter(not_after)
265-
cacert.add_extensions([caext])
266-
cacert.set_serial_number(0)
267-
cacert.sign(cakey, "sha256")
251+
cakey = rsa.generate_private_key(key_size=2048, public_exponent=65537)
252+
casubject = x509.Name(
253+
[x509.NameAttribute(x509.NameOID.COMMON_NAME, "Authority Certificate")]
254+
)
255+
cacert = (
256+
x509.CertificateBuilder()
257+
.subject_name(casubject)
258+
.issuer_name(casubject)
259+
.public_key(cakey.public_key())
260+
.not_valid_before(not_before)
261+
.not_valid_after(not_after)
262+
.add_extension(
263+
x509.BasicConstraints(ca=True, path_length=None), critical=False
264+
)
265+
.serial_number(1)
266+
.sign(cakey, hashes.SHA256())
267+
)
268268

269269
# Step 2
270-
ikey = PKey()
271-
ikey.generate_key(TYPE_RSA, 2048)
272-
icert = X509()
273-
icert.set_version(2)
274-
icert.get_subject().commonName = "Intermediate Certificate"
275-
icert.set_issuer(cacert.get_subject())
276-
icert.set_pubkey(ikey)
277-
icert.set_notBefore(b"20000101000000Z")
278-
icert.set_notAfter(not_after)
279-
icert.add_extensions([caext])
280-
icert.set_serial_number(0)
281-
icert.sign(cakey, "sha256")
270+
ikey = rsa.generate_private_key(key_size=2048, public_exponent=65537)
271+
icert = (
272+
x509.CertificateBuilder()
273+
.subject_name(
274+
x509.Name(
275+
[
276+
x509.NameAttribute(
277+
x509.NameOID.COMMON_NAME, "Intermediate Certificate"
278+
)
279+
]
280+
)
281+
)
282+
.issuer_name(cacert.subject)
283+
.public_key(ikey.public_key())
284+
.not_valid_before(not_before)
285+
.not_valid_after(not_after)
286+
.add_extension(
287+
x509.BasicConstraints(ca=True, path_length=None), critical=False
288+
)
289+
.serial_number(1)
290+
.sign(cakey, hashes.SHA256())
291+
)
282292

283293
# Step 3
284-
skey = PKey()
285-
skey.generate_key(TYPE_RSA, 2048)
286-
scert = X509()
287-
scert.set_version(2)
288-
scert.get_subject().commonName = "Server Certificate"
289-
scert.set_issuer(icert.get_subject())
290-
scert.set_pubkey(skey)
291-
scert.set_notBefore(b"20000101000000Z")
292-
scert.set_notAfter(not_after)
293-
scert.add_extensions(
294-
[X509Extension(b"basicConstraints", True, b"CA:false")]
294+
skey = rsa.generate_private_key(key_size=2048, public_exponent=65537)
295+
scert = (
296+
x509.CertificateBuilder()
297+
.subject_name(
298+
x509.Name(
299+
[
300+
x509.NameAttribute(
301+
x509.NameOID.COMMON_NAME, "Server Certificate"
302+
)
303+
]
304+
)
305+
)
306+
.issuer_name(icert.subject)
307+
.public_key(skey.public_key())
308+
.not_valid_before(not_before)
309+
.not_valid_after(not_after)
310+
.add_extension(
311+
x509.BasicConstraints(ca=False, path_length=None), critical=True
312+
)
313+
.serial_number(1)
314+
.sign(ikey, hashes.SHA256())
295315
)
296-
scert.set_serial_number(0)
297-
scert.sign(ikey, "sha256")
298316

299-
return [(cakey, cacert), (ikey, icert), (skey, scert)]
317+
return [
318+
(PKey.from_cryptography_key(cakey), X509.from_cryptography(cacert)),
319+
(PKey.from_cryptography_key(ikey), X509.from_cryptography(icert)),
320+
(PKey.from_cryptography_key(skey), X509.from_cryptography(scert)),
321+
]
300322

301323

302324
def loopback_client_factory(socket, version=SSLv23_METHOD):

0 commit comments

Comments
 (0)