Generate deterministic expired TLS fixtures on modern OpenSSL
This commit is contained in:
@@ -37,7 +37,9 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
python3 -u tools/tls_fixture.py > build/tls-fixture.log 2>&1 &
|
python3 -m venv build/test-tools
|
||||||
|
build/test-tools/bin/pip install cryptography==46.0.3
|
||||||
|
build/test-tools/bin/python -u tools/tls_fixture.py > build/tls-fixture.log 2>&1 &
|
||||||
TLS_PID=$!
|
TLS_PID=$!
|
||||||
trap 'kill "$TLS_PID" 2>/dev/null || true' EXIT
|
trap 'kill "$TLS_PID" 2>/dev/null || true' EXIT
|
||||||
for attempt in {1..30}; do
|
for attempt in {1..30}; do
|
||||||
|
|||||||
+18
-3
@@ -13,6 +13,9 @@ import subprocess
|
|||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
import zlib
|
import zlib
|
||||||
|
import datetime
|
||||||
|
from cryptography import x509
|
||||||
|
from cryptography.hazmat.primitives import hashes, serialization
|
||||||
|
|
||||||
root = pathlib.Path(__file__).resolve().parents[1]
|
root = pathlib.Path(__file__).resolve().parents[1]
|
||||||
work = root / "build/tls"
|
work = root / "build/tls"
|
||||||
@@ -167,9 +170,21 @@ for name, days in (("valid", "1825"), ("expired", "-1")):
|
|||||||
key, csr, cert = (work / (name + suffix) for suffix in (".key", ".csr", ".pem"))
|
key, csr, cert = (work / (name + suffix) for suffix in (".key", ".csr", ".pem"))
|
||||||
subprocess.run(["openssl", "req", "-new", "-newkey", "rsa:2048", "-nodes", "-config", str(config),
|
subprocess.run(["openssl", "req", "-new", "-newkey", "rsa:2048", "-nodes", "-config", str(config),
|
||||||
"-keyout", str(key), "-out", str(csr)], check=True, capture_output=True, timeout=15)
|
"-keyout", str(key), "-out", str(csr)], check=True, capture_output=True, timeout=15)
|
||||||
subprocess.run(["openssl", "x509", "-req", "-in", str(csr), "-signkey", str(key), "-sha256",
|
if name == "expired":
|
||||||
"-days", days, "-extfile", str(config), "-extensions", "ext", "-out", str(cert)],
|
private_key = serialization.load_pem_private_key(key.read_bytes(), password=None)
|
||||||
check=True, capture_output=True, timeout=15)
|
template = x509.load_pem_x509_certificate((work / "valid.pem").read_bytes())
|
||||||
|
now = datetime.datetime.now(datetime.timezone.utc)
|
||||||
|
builder = (x509.CertificateBuilder().subject_name(template.subject).issuer_name(template.issuer)
|
||||||
|
.public_key(private_key.public_key()).serial_number(x509.random_serial_number())
|
||||||
|
.not_valid_before(now - datetime.timedelta(days=2))
|
||||||
|
.not_valid_after(now - datetime.timedelta(days=1)))
|
||||||
|
for extension in template.extensions:
|
||||||
|
builder = builder.add_extension(extension.value, extension.critical)
|
||||||
|
cert.write_bytes(builder.sign(private_key, hashes.SHA256()).public_bytes(serialization.Encoding.PEM))
|
||||||
|
else:
|
||||||
|
subprocess.run(["openssl", "x509", "-req", "-in", str(csr), "-signkey", str(key), "-sha256",
|
||||||
|
"-days", days, "-extfile", str(config), "-extensions", "ext", "-out", str(cert)],
|
||||||
|
check=True, capture_output=True, timeout=15)
|
||||||
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
|
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
|
||||||
context.minimum_version = ssl.TLSVersion.TLSv1_2
|
context.minimum_version = ssl.TLSVersion.TLSv1_2
|
||||||
context.load_cert_chain(cert, key)
|
context.load_cert_chain(cert, key)
|
||||||
|
|||||||
Reference in New Issue
Block a user