Commit graph

11346 commits

Author SHA1 Message Date
ohemorange
9ba139a9ef
Fix links to --ip-address PRs in changelog (#10562)
As noted in
https://community.letsencrypt.org/t/certbot-5-3-0-release/245097/2, we
have the wrong link here (and it's missing the manual pr link). Let's
just add those in.
2026-02-03 13:30:58 -08:00
Brad Warren
410ee87242
fix compatibility with pyparsing 3 and update to it (#10560)
on main if you run tools/pinning/current/repin.sh and run our unit
tests, they will fail due to new deprecation warnings from pyparsing.
the cause of these warnings is described at
dc009668d8/docs/whats_new_in_3_0_0.rst (L613-L708)

this PR fixes these warnings and updates our minimum required pyparsing
version to 3.0 where the new naming convention is available. i ran our
full test suite on the first commit here and it passed

i don't think it's worth trying to keep compatibility with pyparsing<3
unless we get a request for us to do so which i really doubt we will
2026-02-03 11:51:26 -08:00
Brad Warren
a9746336b7
Merge pull request #10561 from certbot/candidate-5.3.0
Release 5.3.0
2026-02-03 11:49:39 -08:00
Erica Portnoy
1ee73eed10 Bump version to 5.4.0 2026-02-03 09:52:18 -08:00
Erica Portnoy
4de1c60534 Remove built packages from git 2026-02-03 09:52:18 -08:00
Erica Portnoy
54a3078305
Release 5.3.0 2026-02-03 09:52:16 -08:00
Erica Portnoy
6b8bb6c0a3 Update changelog for 5.3.0 release 2026-02-03 09:51:43 -08:00
Will Greenberg
e7c539d3e9
Deprecate functions using acme.crypto_util.Formatto be able to soon remove OpenSSL (#10485)
A few largely unused functions/types have been deprecated in our effort
to remove our pyOpenSSL dependency:
    * Deprecated: `certbot.crypto_util.get_sans_from_cert`
    * Deprecated: `certbot.crypto_util.get_names_from_cert`
    * Deprecated: `certbot.crypto_util.get_names_from_req`
* Deprecated: `certbot.crypto_util.import_csr_file` (and replaced by
`certbot.crypto_util.read_csr_file`)
    * Deprecated: `acme.crypto_util.Format`

`read_csr_file` now always returns a PEM formatted CSR, since that's
what was happening in practice, and therefore lets us stop having to
return a `Format`, so we will be able to stop importing it.

first half of #10433

---------

Co-authored-by: Brad Warren <bmw@users.noreply.github.com>
2026-02-02 16:25:13 -08:00
ohemorange
5cc2f6b4af
List certbot-dns-czechia under 3rd party plugins (#10557)
Fixes https://github.com/certbot/certbot/issues/10553

Link checked as well.

---------

Co-authored-by: Brad Warren <bmw@eff.org>
2026-02-02 23:34:40 +00:00
ohemorange
b362109bf6
Fix certbot tests after updating pytest to 9.0.2 (#10545)
Fixes  #10518.

`tools/pinning/current/repin.sh` is not run; only pytest version is
updated. This is because `pypinning` had a bunch of syntax changes that
seem simply but I believe should be in a separate PR, which I think
should be done after this to collect all repin changes.

As discussed further in #10518, these issues were caused by pytest's
internalization of pytest-subtest, which had several implementation
changes.

To fix these, we simply no longer use subtest in the failing tests. The
test in acme is now parametrized instead, and the tests in apache only
ever had a single parameter.

To use parametrization in the acme test, I converted `DNSTest` from
unittest to pytest style, which was pretty straightforward. The only
note there is that while it would be nice to make `ec_secp384r1_key` a
fixture, you [can't use fixtures in
parameters](https://github.com/pytest-dev/pytest/issues/349). You could
use requests, but that seemed less clear and messier, because then you'd
be checking the value of the parameter and only sometimes loading it.
Could also make it a global variable, but that didn't really seem
necessary, as it's only called twice. Happy to consider other options,
not strongly tied to this one, just seemed nicest to me.
2026-02-02 12:13:24 -08:00
Mike Lim
88af129315
Granular permissions (#9922)
Set granular permissions to TXT DNS records with names starting with
`_acme-challenge.` only
This replaces original policy that is too permissive

The `Condition` clause uses [Route 53 resource record set
permission](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-permissions.html)

Policy tested with Certbot 2.9.0
2026-02-02 11:18:05 -08:00
Brad Warren
991ecd7c8e
update dependencies (#10552)
as of writing this, this resolves all alerts those with access can see
at https://github.com/certbot/certbot/security/dependabot

i ran the full test suite on this branch at
https://dev.azure.com/certbot/certbot/_build/results?buildId=10057&view=results
and everything passed

i don't think this PR requires two reviews
2026-02-02 10:09:02 -08:00
Jacob Hoffman-Andrews
1b7c11e6a5
manual plugin: add IP address support (#10544)
The manual plugin offers environment variables for its hook called
CERTBOT_DOMAIN and CERTBOT_ALL_DOMAINS. I added CERTBOT_IDENTIFIER and
CERTBOT_ALL_IDENTIFIERS, while keeping the old variables for backwards
compatibility. Certbot will pass IP addresses in the CERTBOT_DOMAIN
environment variable rather than erroring out.

Part of #10346

---------

Co-authored-by: Brad Warren <bmw@users.noreply.github.com>
2026-01-29 16:10:45 -08:00
ohemorange
b00e3de9d2
Completely aligns deploy and renew hook behaviors, fully fixing #9978 (#10534)
https://github.com/certbot/certbot/pull/10146 was supposed to do this,
but because of multiple code paths, it did not. This PR simplifies the
code by creating a single code path.

In particular:

- `hooks.renew_hook()` is removed. There are now only calls to
`hooks.deploy_hook()`, which is called during certonly, run, and renew,
and runs both cli and directory hooks.
- `cli_config.renew_hook` is removed. Both `--renew-hook` (hidden option
kept for backwards compatibility purposes and `--deploy-hook` now set
`cli_config.deploy_hook`, which is used internally. When either or both
flags are used multiple times, the last value is kept, which is the
argparse default.
- references to running a "renew hook" internally are changed to "deploy
hook"
- To maintain downgrade compatibility, `deploy_hook` is written out to
renewal config files as `renew_hook`. This is achieved by translating to
and from `renew_hook` in `storage.py` and changing
`renewal.STR_CONFIG_ITEMS` to contain `deploy_hook`.

This results in the following behavior changes:
- Directory hooks are now run when getting a new cert using certonly/run
- If someone set a renew hook on the cli using `--renew-hook`, it would
previously not be run when getting a new (non-renewed) cert, but now
will be. But this option is hidden and should no longer be used anyway.
- When using `certbot reconfigure`, if someone sets `--renew-hook`
certbot will now also ask if someone would like to do a test run of the
new hook, whereas before it would only do so for `--deploy-hook`.

---------

Co-authored-by: Brad Warren <bmw@users.noreply.github.com>
2026-01-29 16:03:20 -08:00
Jacob Hoffman-Andrews
bd7b64f1e7
Fix HTTP01.uri for IPv6 addresses (#10548)
IPv6 addresses in URLs should be enclosed in square brackets.

Note: I chose to fix this by parsing the identifier rather than changing
the method signature. The obvious choice to change the method signature
would be to take `messages.Identifier`. We could even do this backwards
compatibly by taking `str | messages.Identifier`. However, `messages`
imports `challenges`, so referencing `messages.Identifier` here would
require an import loop.

I also considered implementing a new method on, e.g.
messages.Authorization that would take a challenge as a parameter. But
this would be suboptimal because the `uri` method really is specific to
the http-01 challenge type, so it's nice to have it implemented only on
the relevant class.
2026-01-27 20:42:52 -08:00
ohemorange
3b9a1d0d64
Update integration tests to account for default key type changed to ecdsa (#10546)
Fixes #10423.

In
https://github.com/certbot/certbot/pull/10409#issuecomment-3180214385,
we noted that a comment in
`certbot-ci/src/certbot_integration_tests/certbot_tests/test_main.py:test_renew_with_ec_keys`
says:

> since ecdsa is now default, the integration test is not actually
testing "When running non-interactively, if --key-type is unspecified
but the default value differs to the lineage key type, Certbot should
keep the lineage key type." as it says in the comment. To fix that, it
should be initially created with rsa, not ecdsa.

That is no longer accurate, since the default key type changed to
ecdsda.

This PR adds a new test that does what the comment specifies, and
updates the comment to reflect that the existing test no longer does
that.
2026-01-23 14:09:38 -08:00
Osiris Inferi
7d6c1e7732
Clarify using.rst w.r.t. renewal config files (#10441)
Fixes #10440.

---------

Co-authored-by: ohemorange <ebportnoy@gmail.com>
2026-01-23 19:54:37 +00:00
Rüdiger Olschewsky
041581fb33
Add dns-hetzner-cloud to list of third-party plugins (#10541) 2026-01-20 11:47:14 -08:00
Brad Warren
f1985bb01d
add link to useful convo (#10540)
i don't think the conversation at
https://github.com/certbot/certbot/pull/10495#discussion_r2699618989 is
urgent/important enough to make a github issue for it, but i also feel
like it's worth keeping a link around in case any devs have problems
with this code in the future. i think there was some good ideas in there

i don't think this PR requires two reviews
2026-01-16 13:32:45 -08:00
Jacob Hoffman-Andrews
58724f68ec
Add CLI flag --ip-address (#10495)
Co-authored-by: ohemorange <ebportnoy@gmail.com>
Co-authored-by: Brad Warren <bmw@users.noreply.github.com>
2026-01-16 13:23:41 -08:00
Brad Warren
1ea35193ab
disable towncrier wrapping (#10538)
this PR is a follow up to my comment at
https://github.com/certbot/certbot/pull/10495#discussion_r2683527484

i dislike that jsha chose a slightly different column limit than
towncrier which caused it to generate awkwardly short lines in our
changelog. i also dislike contributors having to remember/know about
towncrier's wrapping behavior when writing changelog entries. i'd like
us to find a way to not have to worry about this

i initially looked into trying to set towncrier's line length limit to a
much higher value, but after searching around
https://towncrier.readthedocs.io/en/stable/configuration.html, i don't
think it's configurable

instead, i'm proposing here that we remove the wrapping entirely.
wrapping was added in response to the discussion at
https://github.com/certbot/certbot/pull/10379#discussion_r2243799585.
every markdown viewer i'm aware of automatically nicely handles wrapping
of long lines in markdown. most also automatically merge manually
wrapped lines to wrap based on the user's display/settings. finally,
since the changelog is automatically edited, i think it'll be rare for
certbot devs to have to manually edit the file

because of all this, i think whether the newsfragment was manually
wrapped or not is largely irrelevant, we shouldn't worry about it, and
we should let people wrap or their newsfragments or not as they see fit

i suppose alternatively we could just let towncrier double/awkwardly
wrap entries since i'm making the case that the wrapping doesn't matter,
but i personally have a slight preference for this approach. let me know
what y'all think
2026-01-16 13:15:23 -08:00
Alexis
f33a5b12b2
[DOC] Update version support policy in SECURITY.md (#10489)
Keeping the version matrix consistent with our
[policy](https://github.com/certbot/certbot/wiki/Architectural-Decision-Records-2025#-update-to-certbots-version-policy-and-end-of-life-support-on-previous-major-versions).
2026-01-16 12:59:40 -08:00
Brad Warren
7612d880c4
auto-ignore .DS_Store (#10539)
i'm creating this PR in response to
47c5c88fe1
where ohemorange manually deleted .DS_Store on jsha's PR

rather than doing that or having new certbot devs manually configure
their system to ignore these files, let's just do it for them

i don't think this PR requires two reviews
2026-01-16 11:26:28 -08:00
Brad Warren
d01a6db68a
remove old newsfragment (#10527)
this is a quick fix for the problem i noticed at
https://github.com/certbot/certbot/issues/10526 and that issue is
tracking fixing our tooling to avoid this problem in the future

i personally don't think this PR requires two reviews
2026-01-08 14:38:08 -08:00
Brad Warren
28abca467b
remove email address (#10533)
this is the followup from https://github.com/certbot/josepy/pull/254
doing the same thing on this repo

i personally don't think this PR needs two reviews
2026-01-07 19:03:03 +00:00
Brad Warren
837ff26058
try adding codeowners (#10532)
this fixes https://github.com/certbot/certbot/issues/10462 and i
personally think this is a nice change worth trying

now when people open (non-draft) PRs, one of us will automatically be
assigned hopefully helping to both automate and speed up the review
process

i personally don't think this PR requires two reviews
2026-01-07 10:47:33 -08:00
Brad Warren
089581cad2
update centos pyenv deps (#10529)
this PR fixes the recently nightly test failures by installing the
updated [build dependencies needed by pyenv on
centos](https://github.com/pyenv/pyenv/wiki#suggested-build-environment)

you can see tests passing with this change at
https://dev.azure.com/certbot/certbot/_build/results?buildId=9958&view=results

fwiw, i don't think this PR requires two reviews
2026-01-05 12:40:47 -08:00
Brad Warren
ac8ed3ba4e
move san_test to test dir (#10525)
fixes https://github.com/certbot/certbot/issues/10520

i personally don't think this PR requires a second review
2025-12-17 11:44:26 -08:00
Jacob Hoffman-Andrews
17a1f0e114
Merge pull request #10519 from jsha/dedupe-enforce-domain-sanity
De-duplicate enforce_domain_sanity
2025-12-16 10:31:25 -08:00
Brad Warren
fb3e95e372
make _DomainsAction an external attribute of _internal.cli.cli_utils (#10514)
as i mentioned at
https://github.com/certbot/certbot/pull/10509#discussion_r2601282033, i
didn't love how the tests were using `_DomainsAction` when i think the
leading underscore suggests the class is internal to the cli/cl_utils
module

this PR fixes that

also, i don't think this PR requires two reviews
2025-12-15 16:41:39 -08:00
Brad Warren
36ddada4b3
update pinned dependencies (#10516)
this fixes the dependabot alerts those with access can see at
https://github.com/certbot/certbot/security/dependabot

i don't think those alerts are particularly relevant to us, but i think
it's good for us to update anyway
2025-12-15 15:05:27 -08:00
Brad Warren
4b90db8d29
Merge pull request #10512 from certbot/candidate-5.2.2
Candidate 5.2.2
2025-12-10 10:18:37 -08:00
Will Greenberg
f0aa0c06c3 Bump version to 5.3.0 2025-12-10 09:08:44 -08:00
Will Greenberg
8874ae05e0 Remove built packages from git 2025-12-10 09:08:44 -08:00
Will Greenberg
2e499f5dff
Release 5.2.2 2025-12-10 09:08:43 -08:00
Will Greenberg
97761a1103 Update changelog for 5.2.2 release 2025-12-10 09:08:09 -08:00
Brad Warren
965ee86f3e
remove built packages from 5.2.x (#10511)
this just cherry picks 90507bd07f from
#10502 to this branch

i'll update the release instructions to stop us from dropping this
commit in the future
2025-12-10 09:06:06 -08:00
Will Greenberg
305ebe1c16
Fix --webroot-path action (#10509) (#10510)
Cherry-picks #10509 which fixes #10506. This will eventually make its
way into the 5.2.2 point release

Co-authored-by: Jacob Hoffman-Andrews <github@hoffman-andrews.com>
2025-12-10 08:35:35 -08:00
Jacob Hoffman-Andrews
f6d2ae377d
Fix --webroot-path action (#10509)
Fixes #10506.

When --webroot-path was specified multiple times, Certbot was erroring
with `DNSName SAN compared to non-SAN`. That's because, in the
_WebrootPathAction that builds `namespace.webroot_path`, we were passing
`domain` (type `san.DNSName`) as the keys. The other code that modifies
or accesses `namespace.webroot_path` expects the keys to be of type
`str`. In particular `webroot.Authenticator._set_webroots` does:

```python
            for achall in achalls:
                self.conf("map").setdefault(achall.domain, webroot_path)
```

Where `achall.domain` is a `str`.

Two existing unittests would have caught this: `test_multiwebroot` and
`test_webroot_map_partial_without_perform`. However, they faked out the
parsing of the `--domains` flag, and that faked out code was not updated
in #10468. Since this bug is caused by an interaction between the types
produced by the `--domains` flag and those produced by the
`--webroot-path` flag, the tests failed to catch the problem. I've
updated the tests and confirmed that they fail before the fix is
applied.
2025-12-09 15:37:20 -08:00
Brad Warren
d3c30cfb2d
fix finish_release.py on the 5.2.x point release branch (#10507)
this PR just cherry picks https://github.com/certbot/certbot/pull/10503
to the 5.2.x branch in case we need to do a point release to fix
https://github.com/certbot/certbot/issues/10506 or any other issues
2025-12-08 09:03:46 -08:00
Jacob Hoffman-Andrews
b1cf53ff6b
Add identifier field to AnnotatedChallenge subclasses (#10491)
This field is optional to maintain backwards compatibility. Note that
`AnnotatedChallenge` inherits from `jose.ImmutableMap`, which has a
[check in
__init__](4b74747670/src/josepy/util.py (L125-L131))
that all slots are provided. That check would not allow us to do a
backwards-compatible addition, so I implemented an `__init__` for each
of these subclasses that fills the fields without calling the parent
`__init__`, and so doesn't hit an error when `identifier` is absent.

I chose to use `acme.messages.Identifier` rather than
`certbot._internal.san.SAN` here because these are wrapped ACME types,
so they should use the ACME representation. Also, `AnnotatedChallenge`
is passed to plugins, so we need to pass a type that the plugins can
understand.

Additionally, `domain` is marked as deprecated.

Part of #10346

/cc @bmw, who noticed the issue with `AnnotatedChallenge`
[here](https://github.com/certbot/certbot/pull/10468#issuecomment-3403294394)
and provided additional feedback
[here](https://github.com/jsha/certbot/pull/2#issuecomment-3534895793).
Note that there's still some work to do to finish excising `domain`
assumptions from this portion of the code.

---------

Co-authored-by: ohemorange <ebportnoy@gmail.com>
2025-12-05 13:44:04 -08:00
Brad Warren
9e7a98f4cd
fix finish_release.py (#10503)
in https://github.com/canonical/snapcraft/pull/5720, snapcraft made a
change. `snapcraft status certbot` output changed from something like
this:
```
Track    Arch    Channel    Version     Revision    Progress
latest   amd64   stable     5.1.0       5057        -
                 candidate  ↑           ↑           -
                 beta       5.2.1       5214        -
                 edge       5.2.0.dev0  5210        -
         arm64   stable     5.1.0       5058        -
                 candidate  ↑           ↑           -
                 beta       5.2.1       5215        -
                 edge       5.2.0.dev0  5211        -
         armhf   stable     5.1.0       5056        -
                 candidate  ↑           ↑           -
                 beta       5.2.1       5213        -
                 edge       5.2.0.dev0  5212        -
```
to this:
```
Track    Arch    Channel    Version     Revision    Progress
latest   amd64   stable     5.1.0       5057        -
latest   amd64   candidate  ↑           ↑           -
latest   amd64   beta       5.2.1       5214        -
latest   amd64   edge       5.2.0.dev0  5210        -
latest   arm64   stable     5.1.0       5058        -
latest   arm64   candidate  ↑           ↑           -
latest   arm64   beta       5.2.1       5215        -
latest   arm64   edge       5.2.0.dev0  5211        -
latest   armhf   stable     5.1.0       5056        -
latest   armhf   candidate  ↑           ↑           -
latest   armhf   beta       5.2.1       5213        -
latest   armhf   edge       5.2.0.dev0  5212        -
```
when its output is captured like it is in finish_release.py in the lines
above the code i'm modifying here

not matching on the beginning of lines makes this pattern a little less
strict, but based on the rest of the pattern and the output here, i
personally think this is fine

after carefully verifying this works with the current state of things, i
went ahead and finished the release with this change and it worked just
fine. instead, this PR proposes a way to fix things going forward
2025-12-04 15:15:25 -08:00
ohemorange
8c4e3080dd
Merge pull request #10502 from certbot/candidate-5.2.1
update files from 5.2.1 release
2025-12-03 12:55:54 -08:00
Brad Warren
9a2e508348 Bump version to 5.3.0 2025-12-03 11:48:10 -08:00
Brad Warren
90507bd07f Remove built packages from git 2025-12-03 11:48:10 -08:00
Brad Warren
1127ac1cd7
Release 5.2.1 2025-12-03 11:48:09 -08:00
Brad Warren
65548e36c4 Update changelog for 5.2.1 release 2025-12-03 11:47:31 -08:00
Brad Warren
7f138ca073
add changelog entry about 5.2.1 (#10501)
see the thread at
https://opensource.eff.org/eff-open-source/pl/f5yx4a4q4j8zjyqpmath494jge
for details

since it's only the `v5.2.0` github tag that's borked, we could in
theory try and use like `v5.2.0-2` or something, but there are
[places](259dfadb43/.azure-pipelines/release.yml (L10))
in the release pipeline that use the GH tag as input to the assets they
build, so i think just skipping 5.2.0 altogether is simpler, easier, and
safer

with this change, here's the proposed changelog
```
$ towncrier build --draft --version 5.2.1
Loading template...
Finding news fragments...
Rendering news fragments...
Draft only -- nothing has been written.
What is seen below is what would be written.

## 5.2.1 - 2025-12-02

### Added

- Support for Python 3.14 was added.
  ([#10477](https://github.com/certbot/certbot/issues/10477))

### Changed

- While nothing significant should have changed from the user's perspective,
  we've been doing a lot of internal refactoring in preparation for soon adding
  support for IP address certificates to Certbot.
  ([#10468](https://github.com/certbot/certbot/issues/10468),
  [#10478](https://github.com/certbot/certbot/issues/10478))

### Fixed

- Removed `vhost_combined` and `vhost_common` log formats from included Apache
  configuration file. ([#9769](https://github.com/certbot/certbot/issues/9769))
- Due to a mistake on our end playing with GitHub's new [immutable
  releases](https://github.blog/changelog/2025-10-28-immutable-releases-are-now-generally-available/)
  feature that prevented our CI from uploading additional release assets,
  Certbot 5.2.0 was not and will not be uploaded to most platforms. Instead,
  that version number will be skipped and we'll go straight to 5.2.1.
  ([#10501](https://github.com/certbot/certbot/issues/10501))
2025-12-03 10:10:00 -08:00
Brad Warren
259dfadb43
add changelog entry about IP refactoring (#10498)
if you dislike the general idea of this PR, feel free to just close it,
but i'm scheduled to release the next version of certbot a week from
today and i personally didn't like how
[newsfragments](https://github.com/certbot/certbot/tree/main/newsfragments)
is so empty despite us having done a lot of work on certbot lately

this PR just adds a simple newsfragment highlighting/teasing the work
jsha has been leading on support for IP address certificates which i
imagine would be of interest to some people in the community

```
$ towncrier build --draft --version 5.2.0
Loading template...
Finding news fragments...
Rendering news fragments...
Draft only -- nothing has been written.
What is seen below is what would be written.

## 5.2.0 - 2025-11-25

### Added

- Support for Python 3.14 was added.
  ([#10477](https://github.com/certbot/certbot/issues/10477))

### Changed

- While nothing significant should have changed from the user's perspective,
  we've been doing a lot of internal refactoring in preparation for soon adding
  support for IP address certificates to Certbot.
  ([#10468](https://github.com/certbot/certbot/issues/10468),
  [#10478](https://github.com/certbot/certbot/issues/10478))
```
2025-11-26 13:11:06 -08:00
Jason Owen
6e489cdb74
Remove vhost_combined override from Apache conf (#10486)
The Apache configuration `Include`d in automatically created
`[sitename]-le-ssl.conf` files was redefining the `vhost_combined`
`LogFormat`, but contrary to the comment before the redefinition, did
not include the virtual host server name in the log format. This is
particularly confusing because this redefinition is hard to find when
debugging logging issues, as log formats are not related to SSL/TLS
configuration, and the included configuration file is outside of
`/etc/apache2`.

Additionally, a `vhost_common` `LogFormat` was defined, but not used
anywhere.

The `LogFormat` directives were introduced in commit
68f85d9f1a. Several other directives that
do not directly pertain to configuring SSL/TLS were added in that
commit, and have gradually been removed over the years. This should be
the last such removal.

Delete the `LogFormat` directives from the Apache configuration files
(both old and current), and update the `ALL_SSL_OPTIONS_HASHES`.

Fixes #9769 File 'options-ssl-apache.conf' included in autocreated
'[sitename]-le-ssl.conf' has potentially problematic vhost_combined
LogFormat
2025-11-26 09:03:31 -08:00