Commit Graph
2127 Commits
Author SHA1 Message Date
dnscale-opsandGitHub f769e35e77 Add certbot-dns-dnscale to list of third-party plugins (#10621)
This PR adds `certbot-dns-dnscale` to the list of third-party plugins in
the documentation.

`certbot-dns-dnscale` enables DNS-01 challenge automation for domains
managed with the DNScale DNS service (https://dnscale.eu). The plugin is
Apache 2.0 licensed.

PyPI: https://pypi.org/project/certbot-dns-dnscale/
Source: https://github.com/dnscaleou/certbot-dns-dnscale

Verified with `pip install certbot-dns-dnscale`.
2026-06-24 12:52:45 -07:00
ohemorangeandGitHub a966701c94 Remove Azure references from contributing.rst (#10673) 2026-06-10 17:22:33 -07:00
ohemorangeandGitHub dda67bfb9a Get version number from github instead of azure pipelines in finish_release.py (#10669) 2026-06-10 15:33:22 -07:00
ohemorangeandGitHub 00cdb6f22a Don't build epubs in readthedocs (#10671)
There's no way anyone is using these...

https://github.com/certbot/certbot/pull/9762 was just basing off of
readthedocs' defaults.https://github.com/certbot/certbot/pull/9762 was
just basing off of readthedocs' defaults.

Probably no one is using pdf either, but definitely no one is using
epubs. This is the more cautious version of
https://github.com/certbot/certbot/pull/10670

```
$ git grep epub
acme/docs/Makefile:.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext
acme/docs/Makefile:     @echo "  epub       to make an epub"
acme/docs/Makefile:epub:
acme/docs/Makefile:     $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
acme/docs/Makefile:     @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
acme/docs/make.bat:     echo.  epub       to make an epub
acme/docs/make.bat:if "%1" == "epub" (
acme/docs/make.bat:     %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
acme/docs/make.bat:     echo.Build finished. The epub file is in %BUILDDIR%/epub.
certbot/docs/Makefile:.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext
certbot/docs/Makefile:  @echo "  epub       to make an epub"
certbot/docs/Makefile:epub:
certbot/docs/Makefile:  $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
certbot/docs/Makefile:  @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
certbot/docs/make.bat:  echo.  epub       to make an epub
certbot/docs/make.bat:if "%1" == "epub" (
certbot/docs/make.bat:  %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
certbot/docs/make.bat:  echo.Build finished. The epub file is in %BUILDDIR%/epub.
```
2026-06-10 14:04:18 -07:00
ohemorangeandGitHub fbe3cbdb6e Switch readme.rst badge to GHA nightly workflow status (#10668) 2026-06-10 12:08:27 -07:00
Erik MorénandGitHub da65ffb227 Fix/10598 nginx comment in multiline directive (#10651)
Fixes #10598.

## Pull Request Checklist

- [x] The Certbot team has recently expressed interest in reviewing a PR
for this. If not, this PR may be closed due our limited resources and
need to prioritize how we spend them.
- [x] If you used AI to create this PR, you have done a self-review of
all AI-generated code and disclosed that your contribution was
AI-generated per [EFF's AI-generated contribution
policy](https://www.eff.org/about/opportunities/volunteer/coding-with-eff).
You assert you have thoroughly understood, reviewed, and tested your
entire submission.
- [x] If the change being made is to a [distributed
component](https://certbot.eff.org/docs/contributing.html#code-components-and-layout),
add a description of your change to the `newsfragments` directory. This
should be a file called `<title>.<type>`, where `<title>` is either a
GitHub issue number or some other unique name starting with `+`, and
`<type>` is either `changed`, `fixed`, or `added`.
* For example, if you fixed a bug for issue number 42, create a file
called `42.fixed` and put a description of your change in that file.
- [x] Add or update any documentation as needed to support the changes
in this PR.
- [x] Include your name in `AUTHORS.md` if you like.
2026-06-01 15:22:17 -07:00
Brad Warren b7024352cc Bump version to 5.7.0 2026-05-11 08:57:00 -07:00
Brad Warren 03b5cf3cb0 Release 5.6.0 2026-05-11 08:56:58 -07:00
Brad Warren cf0e0f6783 Update changelog for 5.6.0 release 2026-05-11 08:56:17 -07:00
Brad WarrenandGitHub 208ff18405 remove readthedocs requirements files (#10639)
as those with access can see
[here](https://github.com/certbot/certbot/security/dependabot),
dependabot recently got confused by our readthedocs.org.requirements.txt
files

my read of the situation looking at output like
[this](https://github.com/certbot/certbot/actions/runs/25448194392/job/74658002711#step:3:72)
is dependabot expects paths to local packages to be relative to the
requirements file while readthedocs wants them to relative to the root
of the repo. (i tested changing the paths to be relative to the
requirements file and [readthedocs was not
happy](https://app.readthedocs.org/projects/eff-certbot/builds/32592654/))

to deal with this, we could create a .github/dependabot.yaml file and
set
[exclude-paths](https://docs.github.com/en/code-security/reference/supply-chain-security/dependabot-options-reference#exclude-paths-),
but it strikes me as even simpler and cleaner to just remove these files
if possible

our use of these readthedocs.org.requirements.txt files dates back to
https://github.com/certbot/certbot/pull/261, long before readthedocs
added its .readthedocs.yaml files which we much more recently adopted in
https://github.com/certbot/certbot/pull/9762. inspired by the
suggestions at
https://github.com/readthedocs/readthedocs.org/issues/7258 to workaround
the lack of support for constraints files, i took the approach of
[customizing the build
process](https://docs.readthedocs.com/platform/stable/build-customization.html)

we luckily don't have to override any of the existing readthedocs build
steps. for reference, the build process is described
[here](https://docs.readthedocs.com/platform/stable/builds.html),
however, if you compare the readthedocs build logs from
[main](https://app.readthedocs.org/projects/eff-certbot/builds/32568259/)
and [this
branch](https://app.readthedocs.org/projects/eff-certbot/builds/32597332/),
you'll see they are essentially identical

in addition to the certbot build, i also triggered
[acme](https://app.readthedocs.org/projects/acme-python/builds/32597344/)
and
[dns-cloudflare](https://app.readthedocs.org/projects/certbot-dns-cloudflare/builds/32597347/)
builds from this branch which passed as well

i personally think we can get away with just one review on this PR, but
if the reviewer disagrees, by all means request a second one
2026-05-08 13:59:22 -07:00
c8ebcb49bd Migrate certbot-dns-cloudflare to cloudflare 4.x SDK (#10587)
## Summary

- Migrate `certbot-dns-cloudflare` from the archived `python-cloudflare`
2.x library (`import CloudFlare`) to the actively maintained Cloudflare
Python SDK 4.x (`import cloudflare`)
- Update all API calls to the new SDK surface:
`dns.records.create/list/delete`, `zones.list`, typed response objects
instead of dicts
- Replace `CloudFlare.exceptions.CloudFlareAPIError` with
`cloudflare.APIStatusError` and extract CF error codes from
`response.json()`
- Bump dependency from `cloudflare>=2.19, <2.20` to `cloudflare>=4.0`
- Update oldest pinning from `cloudflare 2.19` to `4.0.0`
- Update all test mocks and assertions accordingly

Fixes #9938

## API Migration

| Operation | Old 2.x | New 4.x |
|---|---|---|
| Import | `import CloudFlare` | `import cloudflare` |
| Client (token) | `CloudFlare.CloudFlare(token=t)` |
`cloudflare.Cloudflare(api_token=t)` |
| Client (key) | `CloudFlare.CloudFlare(email, key)` |
`cloudflare.Cloudflare(api_email=e, api_key=k)` |
| List zones | `cf.zones.get(params={...})` → `list[dict]` |
`cf.zones.list(name=n)` → iterable of Zone objects |
| Create record | `cf.zones.dns_records.post(zone_id, data={...})` |
`cf.dns.records.create(zone_id=id, **data)` |
| List records | `cf.zones.dns_records.get(zone_id, params={...})` |
`cf.dns.records.list(zone_id=id, type=..., ...)` |
| Delete record | `cf.zones.dns_records.delete(zone_id, record_id)` |
`cf.dns.records.delete(dns_record_id=rid, zone_id=zid)` |
| Exceptions | `CloudFlare.exceptions.CloudFlareAPIError` |
`cloudflare.APIStatusError` |

## Test plan

- [x] All 20 existing tests pass with updated mocks
- [x] Credentials INI file format is unchanged — no user-facing config
changes
- [x] Live dry-run renewal tested successfully across 5 domains

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Ember <BeigeBox@users.noreply.github.com>
Co-authored-by: Brad Warren <bmw@users.noreply.github.com>
2026-05-06 09:35:38 -07:00
Erica Portnoy fc91823888 Bump version to 5.6.0 2026-04-07 09:38:18 -07:00
Erica Portnoy 82dda45352 Release 5.5.0 2026-04-07 09:38:17 -07:00
Erica Portnoy 171cb29183 Update changelog for 5.5.0 release 2026-04-07 09:37:45 -07:00
6f1c0b0abd merge certbot-apache and certbot-nginx into certbot (#10522)
based on the suggestion @bmw made in #10484, this moves nearly
everything from `certbot-apache` and `certbot-nginx` into subdirectories
in `certbot/src/certbot/_internal`, and corresponding "extra"
dependencies are made for the certbot distribution. in their place,
entrypoint shims are made in the old distributions.

this way, installing `certbot[nginx]` will pull in the extra
dependencies needed for the nginx code, and also pull in the shim in
`certbot-nginx`, letting our plugin discovery system work just as it did
before. ditto for apache.

note that this doesn't yet deprecate anything, which was one of the
primary goals of the original issue -- i spun out that work into #10521

fixes #10484

---------

Co-authored-by: Brad Warren <bmw@users.noreply.github.com>
Co-authored-by: ohemorange <erica@eff.org>
2026-03-23 18:09:04 -07:00
Brad WarrenandGitHub 9ed92009db deprecate certbot.ocsp (#10584)
this is part of https://github.com/certbot/certbot/issues/10517

to update this description in response to the discussion below, i'd
recommend reviewing this PR by commit. the first commit just moves
ocsp.py under _internal making no other changes while the second commit
fixes everything else up. the diff really isn't as big here as it looks
2026-03-19 15:14:10 -07:00
ohemorangeandGitHub b42b986fb7 List certbot-dns-eurodns as a third-party plugin (#10605)
Fixes https://github.com/certbot/certbot/issues/10603

The link to the github repo is 404'ing. I've asked for a current link,
but the pypi link seems fine to me also. It was released yesterday so it
does seem to still be in active development.

<img width="910" height="214" alt="Screenshot 2026-03-18 at 10 30 19 AM"
src="https://github.com/user-attachments/assets/25208402-ebd1-4d9e-8c46-f1a3f5b83ec0"
/>
2026-03-18 10:52:14 -07:00
James MossandGitHub 26a0b0295b Logo & Wording for DigitalOcean Open Source Sponsorship in Readme.rst (#10601)
In exchange for participating in Open Source Sponsorship, DigitalOcean
has assembled a guide. This commit should bring the readme in line with
the provided guide.

https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/index.html
2026-03-17 13:33:36 -07:00
Brad WarrenandGitHub e9f3c986a2 update manual docs for IP certs (#10596)
i noticed this when reviewing jsha's upcoming blog post

this probably should have been done as part of
https://github.com/certbot/certbot/pull/10544, but we forgot to do it
then

i don't think this PR requires two reviews
2026-03-11 12:51:40 -07:00
Will Greenberg 8ebbe24190 Bump version to 5.5.0 2026-03-10 10:47:29 -07:00
Will Greenberg 95c004cb96 Release 5.4.0 2026-03-10 10:47:28 -07:00
Will Greenberg 564a7b70d6 Update changelog for 5.4.0 release 2026-03-10 10:46:56 -07:00
ohemorangeandGitHub c31974128b Add thanks section to readme; thank digital ocean (#10592)
Fixes https://github.com/certbot/certbot/issues/10580

Direct link to preview of updated README:
https://github.com/certbot/certbot/blob/47786891acc4cb5031d5934de76399620c08a013/certbot/README.rst#thanks
2026-03-06 17:58:31 -08:00
ff281d48a8 Improve the error message when certbot renew is used with the -d option (#10225)
Co-authored-by: Brad Warren <bmw@eff.org>
2026-02-13 23:55:35 +00:00
ohemorangeandGitHub 4c61a450d4 Reset mock call count using reset_mock since new thread-safe implementation means it can no longer just be set to 0 (#10576)
This should fix our failing tests.

Python 3.14.3 has the following in its changelog:

> [gh-142651](https://github.com/python/cpython/issues/142651):
[unittest.mock](https://docs.python.org/3/library/unittest.mock.html#module-unittest.mock):
fix a thread safety issue where
[Mock.call_count](https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.call_count)
may return inaccurate values when the mock is called concurrently from
multiple threads.

As a result, we have to call `reset_mock()` instead of using
`.call_count = 0`. See example
[here](https://github.com/matplotlib/matplotlib/pull/31153).

Tests on my machine showing that this change fixes things, and it's the
only place to fix:
```bash
$ brew upgrade pyenv
$ pyenv install 3.14.3
$ pyenv global 3.14.3
$ tools/venv.py
$ source venv/bin/activate
$ pytest certbot -k "test_rollback_too_many" 
====================================================================== test session starts =======================================================================
platform darwin -- Python 3.14.3, pytest-9.0.2, pluggy-1.6.0
rootdir: /Users/erica/certbot
configfile: pytest.ini
plugins: anyio-4.12.1, xdist-3.8.0, cov-7.0.0
collected 1039 items / 1038 deselected / 1 selected                                                                                                              

certbot/src/certbot/_internal/tests/reverter_test.py .                                                                                                     [100%]

=============================================================== 1 passed, 1038 deselected in 2.94s ===============================================================
$ git grep 'call_count = 0'
$ git checkout main
$ pytest certbot -k "test_rollback_too_many"
====================================================================== test session starts =======================================================================
platform darwin -- Python 3.14.3, pytest-9.0.2, pluggy-1.6.0
rootdir: /Users/erica/certbot
configfile: pytest.ini
plugins: anyio-4.12.1, xdist-3.8.0, cov-7.0.0
collected 1039 items / 1038 deselected / 1 selected                                                                                                              

certbot/src/certbot/_internal/tests/reverter_test.py F                                                                                                     [100%]

============================================================================ FAILURES ============================================================================
_______________________________________________________ TestFullCheckpointsReverter.test_rollback_too_many _______________________________________________________

self = <certbot._internal.tests.reverter_test.TestFullCheckpointsReverter testMethod=test_rollback_too_many>
mock_logger = <MagicMock name='logger' id='4463351456'>

>   ???
E   AssertionError: assert 2 == 1
E    +  where 2 = <MagicMock name='logger.warning' id='4463351792'>.call_count
E    +    where <MagicMock name='logger.warning' id='4463351792'> = <MagicMock name='logger' id='4463351456'>.warning

certbot/src/certbot/_internal/tests/reverter_test.py:363: AssertionError
==================================================================== short test summary info =====================================================================
FAILED certbot/src/certbot/_internal/tests/reverter_test.py::TestFullCheckpointsReverter::test_rollback_too_many - AssertionError: assert 2 == 1
=============================================================== 1 failed, 1038 deselected in 0.48s ===============================================================
$ git grep 'call_count = 0'
certbot/src/certbot/_internal/tests/reverter_test.py:        mock_logger.warning.call_count = 0
```
2026-02-13 13:08:06 -08:00
Jacob Hoffman-AndrewsandGitHub 59a631f21a webroot: add IP address support (#10543)
Part of #10346
2026-02-12 11:00:03 -08:00
Brad WarrenandGitHub 8ae17fd174 update dns-azure URL (#10573)
until sometime in the last year,
https://github.com/binkhq/certbot-dns-azure redirected to
https://github.com/terricain/certbot-dns-azure according to
https://web.archive.org/web/20250901000000*/https://github.com/binkhq/certbot-dns-azure.
since then, that redirect was broken/removed

this has [caused
confusion](https://github.com/certbot/certbot/pull/8727#issuecomment-3880163261)
and since [terricain expressed interest in their plugin being
listed](https://github.com/certbot/certbot/pull/8727#issuecomment-815287041),
let's fix up that link
2026-02-10 14:06:19 -08:00
ohemorangeandGitHub d4681f9a49 Merge pull request #10571 from certbot/candidate-5.3.1
update files from 5.3.1 release
2026-02-10 11:39:30 -08:00
Brad Warren 29de02c160 Bump version to 5.4.0 2026-02-09 13:20:07 -08:00
Brad Warren ec978d593d Release 5.3.1 2026-02-09 13:20:05 -08:00
Brad Warren 3c61eadc8b Update changelog for 5.3.1 release 2026-02-09 13:19:25 -08:00
ohemorangeandGitHub 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
Erica Portnoy 1ee73eed10 Bump version to 5.4.0 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
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
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
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
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
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 OlschewskyandGitHub 041581fb33 Add dns-hetzner-cloud to list of third-party plugins (#10541) 2026-01-20 11:47:14 -08:00
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 WarrenandGitHub 7612d880c4 auto-ignore .DS_Store (#10539)
i'm creating this PR in response to
https://github.com/certbot/certbot/pull/10495/changes/47c5c88fe13dfaf3702a954c17db67a490781457
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 WarrenandGitHub 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 WarrenandGitHub 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-AndrewsandGitHub 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 WarrenandGitHub 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 WarrenandGitHub 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 2e499f5dff Release 5.2.2 2025-12-10 09:08:43 -08:00