You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
DNS persist mode lets you place a **single, long‑lived `_validation-persist` TXT record** in your zone and reuse it for every subsequent issuance and renewal. There is no per-issuance challenge token, so renewals require **no DNS edits** — useful when DNS API access is not available but you still want unattended renewals.
|`--server <ca>`| Pick the CA (default is your configured default). The account is registered automatically if you have not used this CA before. |
417
+
|`--dns-persist-wildcard`| Adds `policy=wildcard` to the record so it also authorizes wildcard / subdomain certs. |
418
+
|`--dns-persist-ca-name <name>`| Use a specific CA identity domain (e.g. `sectigo.com`). If omitted, identities are read from the ACME directory's `caaIdentities` field and one record per identity is printed — you only need to add **any one** of them. |
419
+
|`--dns-persist-days <N>`| Adds `persistUntil=<unix-timestamp>` to the record, set to N days from now. The CA will refuse new validations against the record after that time. Omit for a record with no expiry. |
If the CA exposes a `renewalInfo` endpoint in its ACME directory (Let's Encrypt, ZeroSSL, etc.), `acme.sh` follows [RFC 9773](https://www.rfc-editor.org/rfc/rfc9773.html) automatically — **no flag needed, no opt-in**:
506
+
507
+
| What | When | Why |
508
+
|------|------|-----|
509
+
| 🔍 **Polls `suggestedWindow`**| Every cron run, before deciding to skip | Lets the CA shift the renewal time forward in case of an incident (key compromise, mass revocation, etc.) |
510
+
| 🎯 **Picks a random renewal time** inside the window | Right after a successful issuance/renewal | Disperses renewals across the network so all clients don't hit the CA at the same instant |
511
+
| 🔗 **Sends `replaces=<certID>`** in `newOrder`| On renewal | Lets the CA correlate the new order with the certificate it supersedes (RFC 9773 §5) |
512
+
| ↩️ **Retries without `replaces`**| If the CA rejects with `alreadyReplaced` or an ARI validation error | Robust against edge cases (e.g. switching CAs, retired issuers) |
513
+
514
+
**Renewal trigger logic:** the cert is renewed if **any one** of the following becomes true:
515
+
516
+
1.`--force` is given
517
+
2. The CA's **ARI `suggestedWindow` has started**
518
+
3. The cached `Le_NextRenewTime` has passed (default fallback for CAs without ARI)
519
+
520
+
You can see the resulting next renewal time (already ARI-picked when applicable) in:
521
+
522
+
```sh
523
+
acme.sh --info -d example.com
524
+
# Look for: Le_NextRenewTimeStr=...
525
+
```
526
+
527
+
For the live ARI window the CA is currently advertising, run with `--debug 2`:
> 🔧 Speak ACME language using shell, directly to "Let's Encrypt".
513
590
514
591
---
515
592
516
-
### 1️⃣8️⃣ Acknowledgments
593
+
### 1️⃣9️⃣ Acknowledgments
517
594
518
595
| Project | Link |
519
596
|---------|------|
@@ -555,7 +632,7 @@ Support this project with your organization. Your logo will show up here with a
555
632
556
633
---
557
634
558
-
### 1️⃣9️⃣ License & Others
635
+
### 2️⃣0️⃣ License & Others
559
636
560
637
📄 **License:** GPLv3
561
638
@@ -565,7 +642,7 @@ Support this project with your organization. Your logo will show up here with a
565
642
566
643
---
567
644
568
-
### 2️⃣0️⃣ Donate
645
+
### 2️⃣1️⃣ Donate
569
646
570
647
> 💝 Your donation makes **acme.sh** better!
571
648
@@ -577,7 +654,7 @@ Support this project with your organization. Your logo will show up here with a
577
654
578
655
---
579
656
580
-
### 2️⃣1️⃣ About This Repository
657
+
### 2️⃣2️⃣ About This Repository
581
658
582
659
> [!NOTE]
583
660
> This repository is officially maintained by <strong>ZeroSSL</strong> as part of our commitment to providing secure and reliable SSL/TLS solutions. We welcome contributions and feedback from the community!
0 commit comments