diff -Nru python-certbot-dns-route53-2.9.0/certbot_dns_route53/authenticator.py python-certbot-dns-route53-4.0.0/certbot_dns_route53/authenticator.py --- python-certbot-dns-route53-2.9.0/certbot_dns_route53/authenticator.py 2024-02-08 14:45:17.000000000 -0500 +++ python-certbot-dns-route53-4.0.0/certbot_dns_route53/authenticator.py 1969-12-31 19:00:00.000000000 -0500 @@ -1,17 +0,0 @@ -"""Shim around `~certbot_dns_route53._internal.dns_route53` for backwards compatibility.""" -from typing import Any -import warnings - -from certbot_dns_route53._internal import dns_route53 - - -class Authenticator(dns_route53.Authenticator): - """Shim around `~certbot_dns_route53._internal.dns_route53.Authenticator` - for backwards compatibility.""" - - hidden = True - - def __init__(self, *args: Any, **kwargs: Any) -> None: - warnings.warn("The 'authenticator' module was renamed 'dns_route53'", - DeprecationWarning) - super().__init__(*args, **kwargs) diff -Nru python-certbot-dns-route53-2.9.0/certbot_dns_route53/__init__.py python-certbot-dns-route53-4.0.0/certbot_dns_route53/__init__.py --- python-certbot-dns-route53-2.9.0/certbot_dns_route53/__init__.py 2024-02-08 14:45:17.000000000 -0500 +++ python-certbot-dns-route53-4.0.0/certbot_dns_route53/__init__.py 2025-04-07 18:03:33.000000000 -0400 @@ -63,7 +63,8 @@ * Using the ``AWS_ACCESS_KEY_ID`` and ``AWS_SECRET_ACCESS_KEY`` environment variables. * Using a credentials configuration file at the default location, - ``~/.aws/config``. + ``~/.aws/credentials``. If you're running on sudo, the credentials + will be picked up from the root home. * Using a credentials configuration file at a path supplied using the ``AWS_CONFIG_FILE`` environment variable. @@ -101,13 +102,4 @@ --dns-route53 \\ -d example.com \\ -d www.example.com - -.. code-block:: bash - :caption: To acquire a certificate for ``example.com``, waiting 30 seconds - for DNS propagation - - certbot certonly \\ - --dns-route53 \\ - --dns-route53-propagation-seconds 30 \\ - -d example.com """ diff -Nru python-certbot-dns-route53-2.9.0/certbot_dns_route53/_internal/dns_route53.py python-certbot-dns-route53-4.0.0/certbot_dns_route53/_internal/dns_route53.py --- python-certbot-dns-route53-2.9.0/certbot_dns_route53/_internal/dns_route53.py 2024-02-08 14:45:17.000000000 -0500 +++ python-certbot-dns-route53-4.0.0/certbot_dns_route53/_internal/dns_route53.py 2025-04-07 18:03:33.000000000 -0400 @@ -6,18 +6,21 @@ from typing import Callable from typing import DefaultDict from typing import Dict +from typing import Iterable from typing import List +from typing import Type +from typing import cast import boto3 from botocore.exceptions import ClientError from botocore.exceptions import NoCredentialsError -from acme.challenges import ChallengeResponse +from acme import challenges from certbot import achallenges from certbot import errors +from certbot import interfaces from certbot.achallenges import AnnotatedChallenge -from certbot.plugins import dns_common -from certbot.util import add_deprecated_argument +from certbot.plugins import common logger = logging.getLogger(__name__) @@ -27,7 +30,7 @@ "and add the necessary permissions for Route53 access.") -class Authenticator(dns_common.DNSAuthenticator): +class Authenticator(common.Plugin, interfaces.Authenticator): """Route53 Authenticator This authenticator solves a DNS01 challenge by uploading the answer to AWS @@ -41,6 +44,7 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) self.r53 = boto3.client("route53") + self._attempt_cleanup = False self._resource_records: DefaultDict[str, List[Dict[str, str]]] = \ collections.defaultdict(list) @@ -48,9 +52,9 @@ return "Solve a DNS01 challenge using AWS Route53" @classmethod - def add_parser_arguments(cls, add: Callable[..., None], # pylint: disable=arguments-differ - default_propagation_seconds: int = 10) -> None: - add_deprecated_argument(add, 'propagation-seconds', 1) + def add_parser_arguments(cls, add: Callable[..., None]) -> None: + # This authenticator currently adds no extra arguments. + pass def auth_hint(self, failed_achalls: List[achallenges.AnnotatedChallenge]) -> str: return ( @@ -58,13 +62,13 @@ '--dns-route53. Ensure the above domains have their DNS hosted by AWS Route53.' ) - def _setup_credentials(self) -> None: + def prepare(self) -> None: pass - def _perform(self, domain: str, validation_name: str, validation: str) -> None: - pass + def get_chall_pref(self, unused_domain: str) -> Iterable[Type[challenges.Challenge]]: + return [challenges.DNS01] - def perform(self, achalls: List[AnnotatedChallenge]) -> List[ChallengeResponse]: + def perform(self, achalls: List[AnnotatedChallenge]) -> List[challenges.ChallengeResponse]: self._attempt_cleanup = True try: @@ -82,7 +86,16 @@ raise errors.PluginError("\n".join([str(e), INSTRUCTIONS])) return [achall.response(achall.account_key) for achall in achalls] - def _cleanup(self, domain: str, validation_name: str, validation: str) -> None: + def cleanup(self, achalls: List[achallenges.AnnotatedChallenge]) -> None: + if self._attempt_cleanup: + for achall in achalls: + domain = achall.domain + validation_domain_name = achall.validation_domain_name(domain) + validation = achall.validation(achall.account_key) + + self._cleanup(validation_domain_name, validation) + + def _cleanup(self, validation_name: str, validation: str) -> None: try: self._change_txt_record("DELETE", validation_name, validation) except (NoCredentialsError, ClientError) as e: @@ -95,7 +108,7 @@ domain. """ paginator = self.r53.get_paginator("list_hosted_zones") - zones = [] + zones: list[tuple[str, str]] = [] target_labels = domain.rstrip(".").split(".") for page in paginator.paginate(): for zone in page["HostedZones"]: @@ -152,7 +165,7 @@ ] } ) - return response["ChangeInfo"]["Id"] + return cast(str, response["ChangeInfo"]["Id"]) def _wait_for_change(self, change_id: str) -> None: """Wait for a change to be propagated to all Route53 DNS servers. @@ -166,3 +179,13 @@ raise errors.PluginError( "Timed out waiting for Route53 change. Current status: %s" % response["ChangeInfo"]["Status"]) + + +# Our route53 plugin was initially a 3rd party plugin named `certbot-route53:auth` as described at +# https://github.com/certbot/certbot/issues/4688. This shim exists to allow installations using the +# old plugin name of `certbot-route53:auth` to continue to work without cluttering things like +# Certbot's help output with two route53 plugins. +class HiddenAuthenticator(Authenticator): + """A hidden shim around certbot-dns-route53 for backwards compatibility.""" + + hidden = True diff -Nru python-certbot-dns-route53-2.9.0/certbot_dns_route53/_internal/tests/dns_route53_test.py python-certbot-dns-route53-4.0.0/certbot_dns_route53/_internal/tests/dns_route53_test.py --- python-certbot-dns-route53-2.9.0/certbot_dns_route53/_internal/tests/dns_route53_test.py 2024-02-08 14:45:17.000000000 -0500 +++ python-certbot-dns-route53-4.0.0/certbot_dns_route53/_internal/tests/dns_route53_test.py 2025-04-07 18:03:33.000000000 -0400 @@ -6,17 +6,27 @@ from botocore.exceptions import ClientError from botocore.exceptions import NoCredentialsError +import josepy as jose import pytest +from acme import challenges +from certbot import achallenges from certbot import errors from certbot.compat import os -from certbot.plugins import dns_test_common from certbot.plugins.dns_test_common import DOMAIN +from certbot.tests import acme_util +from certbot.tests import util as test_util +DOMAIN = 'example.com' +KEY = jose.jwk.JWKRSA.load(test_util.load_vector("rsa512_key.pem")) -class AuthenticatorTest(unittest.TestCase, dns_test_common.BaseAuthenticatorTest): + +class AuthenticatorTest(unittest.TestCase): # pylint: disable=protected-access + achall = achallenges.KeyAuthorizationAnnotatedChallenge( + challb=acme_util.DNS01, domain=DOMAIN, account_key=KEY) + def setUp(self): from certbot_dns_route53._internal.dns_route53 import Authenticator @@ -35,9 +45,15 @@ del os.environ["AWS_ACCESS_KEY_ID"] del os.environ["AWS_SECRET_ACCESS_KEY"] + def test_more_info(self) -> None: + self.assertTrue(isinstance(self.auth.more_info(), str)) + + def test_get_chall_pref(self) -> None: + self.assertEqual(self.auth.get_chall_pref("example.org"), [challenges.DNS01]) + def test_perform(self): - self.auth._change_txt_record = mock.MagicMock() - self.auth._wait_for_change = mock.MagicMock() + self.auth._change_txt_record = mock.MagicMock() # type: ignore[method-assign, unused-ignore] + self.auth._wait_for_change = mock.MagicMock() # type: ignore [method-assign, unused-ignore] self.auth.perform([self.achall]) @@ -47,13 +63,14 @@ assert self.auth._wait_for_change.call_count == 1 def test_perform_no_credentials_error(self): - self.auth._change_txt_record = mock.MagicMock(side_effect=NoCredentialsError) + self.auth._change_txt_record = mock.MagicMock( # type: ignore [method-assign, unused-ignore] + side_effect=NoCredentialsError) with pytest.raises(errors.PluginError): self.auth.perform([self.achall]) def test_perform_client_error(self): - self.auth._change_txt_record = mock.MagicMock( + self.auth._change_txt_record = mock.MagicMock( # type: ignore [method-assign, unused-ignore] side_effect=ClientError({"Error": {"Code": "foo"}}, "bar")) with pytest.raises(errors.PluginError): @@ -62,7 +79,7 @@ def test_cleanup(self): self.auth._attempt_cleanup = True - self.auth._change_txt_record = mock.MagicMock() + self.auth._change_txt_record = mock.MagicMock() # type: ignore[method-assign, unused-ignore] self.auth.cleanup([self.achall]) @@ -73,25 +90,19 @@ def test_cleanup_no_credentials_error(self): self.auth._attempt_cleanup = True - self.auth._change_txt_record = mock.MagicMock(side_effect=NoCredentialsError) + self.auth._change_txt_record = mock.MagicMock( # type: ignore [method-assign, unused-ignore] + side_effect=NoCredentialsError) self.auth.cleanup([self.achall]) def test_cleanup_client_error(self): self.auth._attempt_cleanup = True - self.auth._change_txt_record = mock.MagicMock( + self.auth._change_txt_record = mock.MagicMock( # type: ignore [method-assign, unused-ignore] side_effect=ClientError({"Error": {"Code": "foo"}}, "bar")) self.auth.cleanup([self.achall]) - def test_parser_arguments(self) -> None: - from certbot.util import DeprecatedArgumentAction - m = mock.MagicMock() - self.auth.add_parser_arguments(m) # pylint: disable=no-member - m.assert_any_call('propagation-seconds', action=DeprecatedArgumentAction, - help=mock.ANY, nargs=1) - class ClientTest(unittest.TestCase): # pylint: disable=protected-access @@ -200,7 +211,7 @@ self.client._find_zone_id_for_domain("foo.example.com") def test_change_txt_record(self): - self.client._find_zone_id_for_domain = mock.MagicMock() + self.client._find_zone_id_for_domain = mock.MagicMock() # type: ignore [method-assign, unused-ignore] self.client.r53.change_resource_record_sets = mock.MagicMock( return_value={"ChangeInfo": {"Id": 1}}) @@ -210,7 +221,7 @@ assert call_count == 1 def test_change_txt_record_delete(self): - self.client._find_zone_id_for_domain = mock.MagicMock() + self.client._find_zone_id_for_domain = mock.MagicMock() # type: ignore[ method-assign, unused-ignore] self.client.r53.change_resource_record_sets = mock.MagicMock( return_value={"ChangeInfo": {"Id": 1}}) @@ -229,8 +240,7 @@ [validation_record] def test_change_txt_record_multirecord(self): - self.client._find_zone_id_for_domain = mock.MagicMock() - self.client._get_validation_rrset = mock.MagicMock() + self.client._find_zone_id_for_domain = mock.MagicMock() # type: ignore [method-assign, unused-ignore] self.client._resource_records[DOMAIN] = [ {"Value": "\"pre-existing-value\""}, {"Value": "\"pre-existing-value-two\""}, @@ -254,7 +264,7 @@ side_effect=[{"ChangeInfo": {"Status": "PENDING"}}, {"ChangeInfo": {"Status": "INSYNC"}}]) - self.client._wait_for_change(1) + self.client._wait_for_change("1") assert self.client.r53.get_change.called diff -Nru python-certbot-dns-route53-2.9.0/certbot_dns_route53.egg-info/entry_points.txt python-certbot-dns-route53-4.0.0/certbot_dns_route53.egg-info/entry_points.txt --- python-certbot-dns-route53-2.9.0/certbot_dns_route53.egg-info/entry_points.txt 2024-02-08 14:45:43.000000000 -0500 +++ python-certbot-dns-route53-4.0.0/certbot_dns_route53.egg-info/entry_points.txt 2025-04-07 18:03:41.000000000 -0400 @@ -1,3 +1,3 @@ [certbot.plugins] -certbot-route53:auth = certbot_dns_route53.authenticator:Authenticator +certbot-route53:auth = certbot_dns_route53._internal.dns_route53:HiddenAuthenticator dns-route53 = certbot_dns_route53._internal.dns_route53:Authenticator diff -Nru python-certbot-dns-route53-2.9.0/certbot_dns_route53.egg-info/PKG-INFO python-certbot-dns-route53-4.0.0/certbot_dns_route53.egg-info/PKG-INFO --- python-certbot-dns-route53-2.9.0/certbot_dns_route53.egg-info/PKG-INFO 2024-02-08 14:45:43.000000000 -0500 +++ python-certbot-dns-route53-4.0.0/certbot_dns_route53.egg-info/PKG-INFO 2025-04-07 18:03:41.000000000 -0400 @@ -1,6 +1,6 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.4 Name: certbot-dns-route53 -Version: 2.9.0 +Version: 4.0.0 Summary: Route53 DNS Authenticator plugin for Certbot Home-page: https://github.com/certbot/certbot Author: Certbot Project @@ -14,25 +14,35 @@ Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Topic :: Internet :: WWW/HTTP Classifier: Topic :: Security Classifier: Topic :: System :: Installation/Setup Classifier: Topic :: System :: Networking Classifier: Topic :: System :: Systems Administration Classifier: Topic :: Utilities -Requires-Python: >=3.8 +Requires-Python: >=3.9 License-File: LICENSE.txt Requires-Dist: boto3>=1.15.15 -Requires-Dist: setuptools>=41.6.0 -Requires-Dist: acme>=2.9.0 -Requires-Dist: certbot>=2.9.0 +Requires-Dist: acme>=4.0.0 +Requires-Dist: certbot>=4.0.0 Provides-Extra: docs Requires-Dist: Sphinx>=1.0; extra == "docs" Requires-Dist: sphinx_rtd_theme; extra == "docs" Provides-Extra: test Requires-Dist: pytest; extra == "test" +Dynamic: author +Dynamic: author-email +Dynamic: classifier +Dynamic: home-page +Dynamic: keywords +Dynamic: license +Dynamic: license-file +Dynamic: provides-extra +Dynamic: requires-dist +Dynamic: requires-python +Dynamic: summary diff -Nru python-certbot-dns-route53-2.9.0/certbot_dns_route53.egg-info/requires.txt python-certbot-dns-route53-4.0.0/certbot_dns_route53.egg-info/requires.txt --- python-certbot-dns-route53-2.9.0/certbot_dns_route53.egg-info/requires.txt 2024-02-08 14:45:43.000000000 -0500 +++ python-certbot-dns-route53-4.0.0/certbot_dns_route53.egg-info/requires.txt 2025-04-07 18:03:41.000000000 -0400 @@ -1,7 +1,6 @@ boto3>=1.15.15 -setuptools>=41.6.0 -acme>=2.9.0 -certbot>=2.9.0 +acme>=4.0.0 +certbot>=4.0.0 [docs] Sphinx>=1.0 diff -Nru python-certbot-dns-route53-2.9.0/certbot_dns_route53.egg-info/SOURCES.txt python-certbot-dns-route53-4.0.0/certbot_dns_route53.egg-info/SOURCES.txt --- python-certbot-dns-route53-2.9.0/certbot_dns_route53.egg-info/SOURCES.txt 2024-02-08 14:45:43.000000000 -0500 +++ python-certbot-dns-route53-4.0.0/certbot_dns_route53.egg-info/SOURCES.txt 2025-04-07 18:03:41.000000000 -0400 @@ -3,7 +3,6 @@ README.rst setup.py certbot_dns_route53/__init__.py -certbot_dns_route53/authenticator.py certbot_dns_route53/py.typed certbot_dns_route53.egg-info/PKG-INFO certbot_dns_route53.egg-info/SOURCES.txt diff -Nru python-certbot-dns-route53-2.9.0/debian/changelog python-certbot-dns-route53-4.0.0/debian/changelog --- python-certbot-dns-route53-2.9.0/debian/changelog 2024-02-16 15:41:07.000000000 -0500 +++ python-certbot-dns-route53-4.0.0/debian/changelog 2025-05-24 22:56:19.000000000 -0400 @@ -1,3 +1,11 @@ +python-certbot-dns-route53 (4.0.0-1) unstable; urgency=medium + + * d/watch: newer packages use an underscore + * New upstream version 4.0.0 + * Bump dependency requirements (Closes: #1106478) + + -- Harlan Lieberman-Berg Sat, 24 May 2025 22:56:19 -0400 + python-certbot-dns-route53 (2.9.0-1) unstable; urgency=medium * New upstream version 2.9.0 diff -Nru python-certbot-dns-route53-2.9.0/debian/control python-certbot-dns-route53-4.0.0/debian/control --- python-certbot-dns-route53-2.9.0/debian/control 2024-02-16 15:40:34.000000000 -0500 +++ python-certbot-dns-route53-4.0.0/debian/control 2025-05-24 22:56:04.000000000 -0400 @@ -7,9 +7,9 @@ Build-Depends: debhelper-compat (= 13), dh-python, python3, - python3-acme-abi-2 (>= 2.1~), + python3-acme-abi-4 (>= 4.0~), python3-boto3, - python3-certbot-abi-2 (>= 2.1~), + python3-certbot-abi-4 (>= 4.0~), python3-mock, python3-pytest, python3-setuptools, @@ -26,7 +26,7 @@ Package: python3-certbot-dns-route53 Architecture: all Depends: certbot, - python3-certbot-abi-2 (>= ${Abi-major-minor-version}), + python3-certbot-abi-4 (>= ${Abi-major-minor-version}), ${misc:Depends}, ${python3:Depends} Enhances: certbot diff -Nru python-certbot-dns-route53-2.9.0/debian/watch python-certbot-dns-route53-4.0.0/debian/watch --- python-certbot-dns-route53-2.9.0/debian/watch 2021-08-23 18:37:56.000000000 -0400 +++ python-certbot-dns-route53-4.0.0/debian/watch 2025-05-24 22:55:07.000000000 -0400 @@ -1,4 +1,4 @@ version=4 opts=uversionmangle=s/(rc|a|b|c)/~$1/,pgpsigurlmangle=s/$/.asc/ \ -https://pypi.debian.net/certbot-dns-route53/certbot-dns-route53-(.+)\.(?:zip|tgz|tbz|txz|(?:tar\.(?:gz|bz2|xz))) +https://pypi.debian.net/certbot-dns-route53/certbot_dns_route53-(.+)\.(?:zip|tgz|tbz|txz|(?:tar\.(?:gz|bz2|xz))) diff -Nru python-certbot-dns-route53-2.9.0/docs/conf.py python-certbot-dns-route53-4.0.0/docs/conf.py --- python-certbot-dns-route53-2.9.0/docs/conf.py 2024-02-08 14:45:17.000000000 -0500 +++ python-certbot-dns-route53-4.0.0/docs/conf.py 2025-04-07 18:03:33.000000000 -0400 @@ -170,6 +170,6 @@ # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { 'python': ('https://docs.python.org/', None), - 'acme': ('https://acme-python.readthedocs.org/en/latest/', None), + 'acme': ('https://acme-python.readthedocs.io/en/latest/', None), 'certbot': ('https://eff-certbot.readthedocs.io/en/stable/', None), } diff -Nru python-certbot-dns-route53-2.9.0/PKG-INFO python-certbot-dns-route53-4.0.0/PKG-INFO --- python-certbot-dns-route53-2.9.0/PKG-INFO 2024-02-08 14:45:43.503189000 -0500 +++ python-certbot-dns-route53-4.0.0/PKG-INFO 2025-04-07 18:03:41.034472200 -0400 @@ -1,6 +1,6 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.4 Name: certbot-dns-route53 -Version: 2.9.0 +Version: 4.0.0 Summary: Route53 DNS Authenticator plugin for Certbot Home-page: https://github.com/certbot/certbot Author: Certbot Project @@ -14,25 +14,35 @@ Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Topic :: Internet :: WWW/HTTP Classifier: Topic :: Security Classifier: Topic :: System :: Installation/Setup Classifier: Topic :: System :: Networking Classifier: Topic :: System :: Systems Administration Classifier: Topic :: Utilities -Requires-Python: >=3.8 +Requires-Python: >=3.9 License-File: LICENSE.txt Requires-Dist: boto3>=1.15.15 -Requires-Dist: setuptools>=41.6.0 -Requires-Dist: acme>=2.9.0 -Requires-Dist: certbot>=2.9.0 +Requires-Dist: acme>=4.0.0 +Requires-Dist: certbot>=4.0.0 Provides-Extra: docs Requires-Dist: Sphinx>=1.0; extra == "docs" Requires-Dist: sphinx_rtd_theme; extra == "docs" Provides-Extra: test Requires-Dist: pytest; extra == "test" +Dynamic: author +Dynamic: author-email +Dynamic: classifier +Dynamic: home-page +Dynamic: keywords +Dynamic: license +Dynamic: license-file +Dynamic: provides-extra +Dynamic: requires-dist +Dynamic: requires-python +Dynamic: summary diff -Nru python-certbot-dns-route53-2.9.0/setup.py python-certbot-dns-route53-4.0.0/setup.py --- python-certbot-dns-route53-2.9.0/setup.py 2024-02-08 14:45:18.000000000 -0500 +++ python-certbot-dns-route53-4.0.0/setup.py 2025-04-07 18:03:33.000000000 -0400 @@ -4,11 +4,10 @@ from setuptools import find_packages from setuptools import setup -version = '2.9.0' +version = '4.0.0' install_requires = [ 'boto3>=1.15.15', - 'setuptools>=41.6.0', ] if os.environ.get('SNAP_BUILD'): @@ -39,7 +38,7 @@ author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.8', + python_requires='>=3.9', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,11 +47,11 @@ 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', 'Programming Language :: Python :: 3.12', + 'Programming Language :: Python :: 3.13', 'Topic :: Internet :: WWW/HTTP', 'Topic :: Security', 'Topic :: System :: Installation/Setup', @@ -71,7 +70,7 @@ entry_points={ 'certbot.plugins': [ 'dns-route53 = certbot_dns_route53._internal.dns_route53:Authenticator', - 'certbot-route53:auth = certbot_dns_route53.authenticator:Authenticator' + 'certbot-route53:auth = certbot_dns_route53._internal.dns_route53:HiddenAuthenticator', ], }, )