diff --git a/acme/setup.py b/acme/setup.py index 9bf7e4e28..72a6792a2 100644 --- a/acme/setup.py +++ b/acme/setup.py @@ -6,12 +6,13 @@ from setuptools import setup version = '3.2.0.dev0' install_requires = [ - 'cryptography>=3.2.1', + 'cryptography>=42.0.0', # Josepy 2+ may introduce backward incompatible changes by droping usage of # deprecated PyOpenSSL APIs. 'josepy>=1.13.0, <2', - # pyOpenSSL 23.1.0 is a bad release: https://github.com/pyca/pyopenssl/issues/1199 - 'PyOpenSSL>=17.5.0,!=23.1.0', + # PyOpenSSL>=25.0.0 is just needed to satisfy mypy right now so this dependency can probably be + # relaxed to >=24.0.0 if needed. + 'PyOpenSSL>=25.0.0', 'pyrfc3339', 'pytz>=2019.3', 'requests>=2.20.0', diff --git a/certbot-nginx/setup.py b/certbot-nginx/setup.py index 1abc31408..8d20e5b89 100644 --- a/certbot-nginx/setup.py +++ b/certbot-nginx/setup.py @@ -9,8 +9,9 @@ install_requires = [ # https://github.com/certbot/certbot/issues/8761 for more info. f'acme>={version}', f'certbot>={version}', - # pyOpenSSL 23.1.0 is a bad release: https://github.com/pyca/pyopenssl/issues/1199 - 'PyOpenSSL>=17.5.0,!=23.1.0', + # PyOpenSSL>=25.0.0 is just needed to satisfy mypy right now so this dependency can probably be + # relaxed to >=24.0.0 if needed. + 'PyOpenSSL>=25.0.0', 'pyparsing>=2.4.7', ] diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index f1da9fe65..434ecc1ec 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -11,7 +11,8 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). ### Changed * certbot-nginx now requires pyparsing>=2.4.7. -* +* certbot and its acme library now require cryptography>=42.0.0. +* certbot-nginx and our acme library now require pyOpenSSL>=25.0.0. ### Fixed diff --git a/certbot/certbot/crypto_util.py b/certbot/certbot/crypto_util.py index 62913bf74..fd77d5342 100644 --- a/certbot/certbot/crypto_util.py +++ b/certbot/certbot/crypto_util.py @@ -8,7 +8,6 @@ import datetime import hashlib import logging import re -import warnings from typing import List from typing import Optional from typing import Set @@ -171,13 +170,7 @@ def csr_matches_pubkey(csr: bytes, privkey: bytes) -> bool: """ req = x509.load_pem_x509_csr(csr) pkey = serialization.load_pem_private_key(privkey, password=None) - # This would be better written as `req.public_key() == pkey.public_key()`, - # but that requires a newer minimum version of cryptography. - return req.is_signature_valid and req.public_key().public_bytes( - serialization.Encoding.DER, serialization.PublicFormat.SubjectPublicKeyInfo - ) == pkey.public_key().public_bytes( - serialization.Encoding.DER, serialization.PublicFormat.SubjectPublicKeyInfo - ) + return req.is_signature_valid and req.public_key() == pkey.public_key() def import_csr_file( @@ -514,12 +507,7 @@ def notBefore(cert_path: str) -> datetime.datetime: """ with open(cert_path, "rb") as f: cert = x509.load_pem_x509_certificate(f.read()) - # TODO: This should be `not_valid_before_utc` once we raise the minimum - # cryptography version. - # https://github.com/certbot/certbot/issues/10105 - with warnings.catch_warnings(): - warnings.filterwarnings('ignore', message='Properties that return.*datetime object') - return cert.not_valid_before.replace(tzinfo=datetime.timezone.utc) + return cert.not_valid_before_utc def notAfter(cert_path: str) -> datetime.datetime: @@ -533,12 +521,7 @@ def notAfter(cert_path: str) -> datetime.datetime: """ with open(cert_path, "rb") as f: cert = x509.load_pem_x509_certificate(f.read()) - # TODO: This should be `not_valid_after_utc` once we raise the minimum - # cryptography version. - # https://github.com/certbot/certbot/issues/10105 - with warnings.catch_warnings(): - warnings.filterwarnings('ignore', message='Properties that return.*datetime object') - return cert.not_valid_after.replace(tzinfo=datetime.timezone.utc) + return cert.not_valid_after_utc def sha256sum(filename: str) -> str: diff --git a/certbot/docs/contributing.rst b/certbot/docs/contributing.rst index 52cbab72e..18b47f565 100644 --- a/certbot/docs/contributing.rst +++ b/certbot/docs/contributing.rst @@ -632,27 +632,19 @@ If you want to learn more about the design used here, see Choosing dependency versions ---------------------------- -A number of Unix distributions create third-party Certbot packages for their users. -Where feasible, the Certbot project tries to manage its dependencies in a way that -does not create avoidable work for packagers. +When choosing dependency versions, we should choose whatever minimum versions +simplify development of Certbot and our own distribution methods such as snaps, +pip, and docker. Since these approaches have full access to PyPI, it's OK if +the required packages declared in ``setup.py`` are quite new. -Avoiding adding new dependencies is a good way to help with this. - -When adding new or upgrading existing Python dependencies, Certbot developers should -pay attention to which distributions are actively packaging Certbot. In particular: - -- EPEL (used by RHEL/CentOS/Fedora) updates Certbot regularly. At the time of writing, - EPEL9 is the release of EPEL where Certbot is being updated, but check the `EPEL - home page `_ and `pkgs.org - `_ for the latest release. -- Debian and Ubuntu only package Certbot when making new releases of their distros. - Checking the available version of dependencies in Debian "sid" and "unstable" can help - to identify dependencies that are likely to be available in the next stable release of - these distros. - -If a dependency is already packaged in these distros and is acceptable for use in Certbot, -the oldest packaged version of that dependency should be chosen and set as the minimum -version in ``setup.py``. +If this approach to development creates significant trouble for some of our users, we +can revisit this decision and weigh their trouble against the difficulties +involved in maintaining support for a wider range of package versions. When +doing this, we should also be sure to consider the feasibility of users getting +access to these newer packages on their system rather than changing our own +approach here. Their OS distribution may be able to package it, especially in +an alternate repository and/or for a different version of Python to help avoid +conflicts with other packages on their system. macOS suggestions ================= diff --git a/certbot/setup.py b/certbot/setup.py index f8c478a01..b18bf27a7 100644 --- a/certbot/setup.py +++ b/certbot/setup.py @@ -30,7 +30,7 @@ install_requires = [ f'acme>={version}', 'ConfigArgParse>=1.5.3', 'configobj>=5.0.6', - 'cryptography>=3.2.1', + 'cryptography>=42.0.0', 'distro>=1.0.1', 'importlib_metadata>=4.6; python_version < "3.10"', # Josepy 2+ may introduce backward incompatible changes by droping usage of diff --git a/tools/oldest_constraints.txt b/tools/oldest_constraints.txt index 9d9d0d6de..bafa13479 100644 --- a/tools/oldest_constraints.txt +++ b/tools/oldest_constraints.txt @@ -15,7 +15,7 @@ colorama==0.4.6 ; python_version >= "3.9" and python_version < "3.10" and sys_pl configargparse==1.5.3 ; python_version >= "3.9" and python_version < "3.10" configobj==5.0.6 ; python_version >= "3.9" and python_version < "3.10" coverage==7.6.10 ; python_version >= "3.9" and python_version < "3.10" -cryptography==3.2.1 ; python_version >= "3.9" and python_version < "3.10" +cryptography==42.0.0 ; python_version >= "3.9" and python_version < "3.10" cython==0.29.37 ; python_version >= "3.9" and python_version < "3.10" dill==0.3.9 ; python_version >= "3.9" and python_version < "3.10" distlib==0.3.9 ; python_version >= "3.9" and python_version < "3.10" @@ -55,7 +55,7 @@ pyasn1-modules==0.4.1 ; python_version >= "3.9" and python_version < "3.10" pyasn1==0.4.8 ; python_version >= "3.9" and python_version < "3.10" pycparser==2.14 ; python_version >= "3.9" and python_version < "3.10" pylint==3.3.3 ; python_version >= "3.9" and python_version < "3.10" -pyopenssl==17.5.0 ; python_version >= "3.9" and python_version < "3.10" +pyopenssl==25.0.0 ; python_version >= "3.9" and python_version < "3.10" pyotp==2.9.0 ; python_version >= "3.9" and python_version < "3.10" pyparsing==2.4.7 ; python_version >= "3.9" and python_version < "3.10" pyrfc3339==1.0 ; python_version >= "3.9" and python_version < "3.10" @@ -79,9 +79,9 @@ tldextract==5.1.3 ; python_version >= "3.9" and python_version < "3.10" tomli==2.2.1 ; python_version >= "3.9" and python_version < "3.10" tomlkit==0.13.2 ; python_version >= "3.9" and python_version < "3.10" tox==1.9.2 ; python_version >= "3.9" and python_version < "3.10" -types-cryptography==3.3.23.2 ; python_version >= "3.9" and python_version < "3.10" +types-cffi==1.16.0.20241221 ; python_version >= "3.9" and python_version < "3.10" types-httplib2==0.22.0.20241221 ; python_version >= "3.9" and python_version < "3.10" -types-pyopenssl==23.0.0.0 ; python_version >= "3.9" and python_version < "3.10" +types-pyopenssl==24.1.0.20240722 ; python_version >= "3.9" and python_version < "3.10" types-pyrfc3339==2.0.1.20241107 ; python_version >= "3.9" and python_version < "3.10" types-python-dateutil==2.9.0.20241206 ; python_version >= "3.9" and python_version < "3.10" types-pytz==2024.2.0.20241221 ; python_version >= "3.9" and python_version < "3.10" diff --git a/tools/pinning/oldest/pyproject.toml b/tools/pinning/oldest/pyproject.toml index 23486cc2c..a56befb2f 100644 --- a/tools/pinning/oldest/pyproject.toml +++ b/tools/pinning/oldest/pyproject.toml @@ -1,5 +1,13 @@ +# The purpose of this file is to help us test Certbot against the oldest +# versions of our dependencies which we claim to support in our setup.py files. +# # Security alerts about vulnerable packages in this file can be ignored since # they are only used during testing. +# +# Ideally, generating package pinnings based on our minimum allowed dependency +# versions would be done automatically by tooling, but as of writing this, both +# https://github.com/pypa/pip/issues/8085 and +# https://github.com/python-poetry/poetry/issues/3527 remain unresolved. [tool.poetry] name = "certbot-pinner" version = "0.1.0" @@ -52,7 +60,7 @@ cffi = "1.12.3" chardet = "3.0.4" cloudflare = "1.5.1" configobj = "5.0.6" -cryptography = "3.2.1" +cryptography = "42.0.0" distro = "1.0.1" dns-lexicon = "3.15.1" dnspython = "2.6.1" @@ -67,7 +75,7 @@ ndg-httpsclient = "0.3.2" parsedatetime = "2.4" pbr = "1.8.0" ply = "3.4" -pyOpenSSL = "17.5.0" +pyOpenSSL = "25.0.0" pyRFC3339 = "1.0" pyasn1 = "0.4.8" pycparser = "2.14" diff --git a/tools/requirements.txt b/tools/requirements.txt index 739cbf958..ac8ad11a2 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -16,10 +16,10 @@ babel==2.16.0 ; python_version >= "3.9" and python_version < "4.0" backports-tarfile==1.2.0 ; python_version >= "3.9" and python_version < "3.12" bcrypt==4.2.1 ; python_version >= "3.9" and python_version < "4.0" beautifulsoup4==4.12.3 ; python_version >= "3.9" and python_version < "4.0" -boto3==1.35.93 ; python_version >= "3.9" and python_version < "4.0" -botocore==1.35.93 ; python_version >= "3.9" and python_version < "4.0" +boto3==1.35.99 ; python_version >= "3.9" and python_version < "4.0" +botocore==1.35.99 ; python_version >= "3.9" and python_version < "4.0" build==1.2.2.post1 ; python_version >= "3.9" and python_version < "4.0" -cachecontrol==0.14.1 ; python_version >= "3.9" and python_version < "4.0" +cachecontrol==0.14.2 ; python_version >= "3.9" and python_version < "4.0" cachetools==5.5.0 ; python_version >= "3.9" and python_version < "4.0" certifi==2024.12.14 ; python_version >= "3.9" and python_version < "4.0" cffi==1.17.1 ; python_version >= "3.9" and python_version < "4.0" @@ -50,7 +50,7 @@ fabric==3.2.2 ; python_version >= "3.9" and python_version < "4.0" fastjsonschema==2.21.1 ; python_version >= "3.9" and python_version < "4.0" filelock==3.16.1 ; python_version >= "3.9" and python_version < "4.0" google-api-core==2.24.0 ; python_version >= "3.9" and python_version < "4.0" -google-api-python-client==2.157.0 ; python_version >= "3.9" and python_version < "4.0" +google-api-python-client==2.159.0 ; python_version >= "3.9" and python_version < "4.0" google-auth-httplib2==0.2.0 ; python_version >= "3.9" and python_version < "4.0" google-auth==2.37.0 ; python_version >= "3.9" and python_version < "4.0" googleapis-common-protos==1.66.0 ; python_version >= "3.9" and python_version < "4.0" @@ -81,7 +81,7 @@ markupsafe==3.0.2 ; python_version >= "3.9" and python_version < "4.0" matplotlib-inline==0.1.7 ; python_version >= "3.9" and python_version < "4.0" mccabe==0.7.0 ; python_version >= "3.9" and python_version < "4.0" mdurl==0.1.2 ; python_version >= "3.9" and python_version < "4.0" -more-itertools==10.5.0 ; python_version >= "3.9" and python_version < "4.0" +more-itertools==10.6.0 ; python_version >= "3.9" and python_version < "4.0" msgpack==1.1.0 ; python_version >= "3.9" and python_version < "4.0" msrest==0.7.1 ; python_version >= "3.9" and python_version < "4.0" mypy-extensions==1.0.0 ; python_version >= "3.9" and python_version < "4.0" @@ -98,12 +98,12 @@ pkginfo==1.12.0 ; python_version >= "3.9" and python_version < "4.0" platformdirs==4.3.6 ; python_version >= "3.9" and python_version < "4.0" pluggy==1.5.0 ; python_version >= "3.9" and python_version < "4.0" ply==3.11 ; python_version >= "3.9" and python_version < "4.0" -poetry-core==2.0.0 ; python_version >= "3.9" and python_version < "4.0" -poetry-plugin-export==1.8.0 ; python_version >= "3.9" and python_version < "4.0" -poetry==2.0.0 ; python_version >= "3.9" and python_version < "4.0" +poetry-core==2.0.1 ; python_version >= "3.9" and python_version < "4.0" +poetry-plugin-export==1.9.0 ; python_version >= "3.9" and python_version < "4.0" +poetry==2.0.1 ; python_version >= "3.9" and python_version < "4.0" prompt-toolkit==3.0.48 ; python_version >= "3.9" and python_version < "4.0" proto-plus==1.25.0 ; python_version >= "3.9" and python_version < "4.0" -protobuf==5.29.2 ; python_version >= "3.9" and python_version < "4.0" +protobuf==5.29.3 ; python_version >= "3.9" and python_version < "4.0" ptyprocess==0.7.0 ; python_version >= "3.9" and python_version < "4.0" and sys_platform != "win32" pure-eval==0.2.3 ; python_version >= "3.9" and python_version < "4.0" pyasn1-modules==0.4.1 ; python_version >= "3.9" and python_version < "4.0" @@ -112,7 +112,7 @@ pycparser==2.22 ; python_version >= "3.9" and python_version < "4.0" pygments==2.19.1 ; python_version >= "3.9" and python_version < "4.0" pylint==3.3.3 ; python_version >= "3.9" and python_version < "4.0" pynacl==1.5.0 ; python_version >= "3.9" and python_version < "4.0" -pyopenssl==24.3.0 ; python_version >= "3.9" and python_version < "4.0" +pyopenssl==25.0.0 ; python_version >= "3.9" and python_version < "4.0" pyotp==2.9.0 ; python_version >= "3.9" and python_version < "4.0" pyparsing==3.2.1 ; python_version >= "3.9" and python_version < "4.0" pyproject-api==1.8.0 ; python_version >= "3.9" and python_version < "4.0" @@ -141,7 +141,7 @@ s3transfer==0.10.4 ; python_version >= "3.9" and python_version < "4.0" secretstorage==3.3.3 ; python_version >= "3.9" and python_version < "4.0" and sys_platform == "linux" semantic-version==2.10.0 ; python_version >= "3.9" and python_version < "4.0" setuptools-rust==1.10.2 ; python_version >= "3.9" and python_version < "4.0" -setuptools==75.7.0 ; python_version >= "3.9" and python_version < "4.0" +setuptools==75.8.0 ; python_version >= "3.9" and python_version < "4.0" shellingham==1.5.4 ; python_version >= "3.9" and python_version < "4.0" six==1.17.0 ; python_version >= "3.9" and python_version < "4.0" snowballstemmer==2.2.0 ; python_version >= "3.9" and python_version < "4.0" @@ -161,7 +161,7 @@ tomli==2.2.1 ; python_version >= "3.9" and python_full_version <= "3.11.0a6" tomlkit==0.13.2 ; python_version >= "3.9" and python_version < "4.0" tox==4.23.2 ; python_version >= "3.9" and python_version < "4.0" traitlets==5.14.3 ; python_version >= "3.9" and python_version < "4.0" -trove-classifiers==2025.1.6.15 ; python_version >= "3.9" and python_version < "4.0" +trove-classifiers==2025.1.10.15 ; python_version >= "3.9" and python_version < "4.0" twine==6.0.1 ; python_version >= "3.9" and python_version < "4.0" types-cffi==1.16.0.20241221 ; python_version >= "3.9" and python_version < "4.0" types-httplib2==0.22.0.20241221 ; python_version >= "3.9" and python_version < "4.0" @@ -171,7 +171,7 @@ types-python-dateutil==2.9.0.20241206 ; python_version >= "3.9" and python_versi types-pytz==2024.2.0.20241221 ; python_version >= "3.9" and python_version < "4.0" types-pywin32==308.0.0.20241221 ; python_version >= "3.9" and python_version < "4.0" types-requests==2.31.0.6 ; python_version >= "3.9" and python_version < "4.0" -types-setuptools==75.6.0.20241223 ; python_version >= "3.9" and python_version < "4.0" +types-setuptools==75.8.0.20250110 ; python_version >= "3.9" and python_version < "4.0" types-urllib3==1.26.25.14 ; python_version >= "3.9" and python_version < "4.0" typing-extensions==4.12.2 ; python_version >= "3.9" and python_version < "4.0" uritemplate==4.1.1 ; python_version >= "3.9" and python_version < "4.0" @@ -179,6 +179,6 @@ urllib3==1.26.20 ; python_version >= "3.9" and python_version < "4.0" virtualenv==20.28.1 ; python_version >= "3.9" and python_version < "4.0" wcwidth==0.2.13 ; python_version >= "3.9" and python_version < "4.0" wheel==0.45.1 ; python_version >= "3.9" and python_version < "4.0" -wrapt==1.17.0 ; python_version >= "3.9" and python_version < "4.0" +wrapt==1.17.2 ; python_version >= "3.9" and python_version < "4.0" xattr==1.1.4 ; python_version >= "3.9" and python_version < "4.0" and sys_platform == "darwin" zipp==3.21.0 ; python_version >= "3.9" and python_version < "3.12"