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
Copy file name to clipboardExpand all lines: README.md
+39-10Lines changed: 39 additions & 10 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -37,6 +37,10 @@ CoyoteCert introduces `dns-persist-01`: deploy the TXT record once, leave it in
37
37
38
38
Let's Encrypt's `shortlived` profile issues 6-day certificates with no OCSP or CRL requirements. CoyoteCert passes the profile through and silently ignores it for CAs that don't support profiles yet.
39
39
40
+
### IP address certificates (RFC 8738)
41
+
42
+
Pass an IP address to `->identifiers()` and CoyoteCert handles the rest: `type: ip` on the ACME order, `IP:` SAN entries in the CSR. Mix hostnames and IPs freely in the same call. Useful for internal services, load balancer VIPs, and edge nodes where a hostname isn't always available.
43
+
40
44
### Swappable HTTP client (PSR-18)
41
45
42
46
The built-in curl client needs no extra dependencies. Need proxy support, custom middleware, or framework integration? Swap it for any PSR-18 client (Symfony HttpClient, Guzzle, anything else) with one builder call.
@@ -92,7 +96,7 @@ use CoyoteCert\Storage\FilesystemStorage;
92
96
93
97
$cert = CoyoteCert::with(new LetsEncrypt())
94
98
->storage(new FilesystemStorage('/var/certs'))
95
-
->domains('example.com')
99
+
->identifiers('example.com')
96
100
->email('admin@example.com')
97
101
->challenge(new Http01Handler('/var/www/html'))
98
102
->issueOrRenew();
@@ -443,7 +447,7 @@ Always requests a new certificate from the CA, regardless of what is in storage.
443
447
```php
444
448
$cert = CoyoteCert::with(new LetsEncrypt())
445
449
->storage(new FilesystemStorage('/var/certs'))
446
-
->domains('example.com')
450
+
->identifiers('example.com')
447
451
->email('admin@example.com')
448
452
->challenge(new Http01Handler('/var/www/html'))
449
453
->issue();
@@ -456,7 +460,7 @@ The recommended method for production. Returns the existing certificate if it is
456
460
```php
457
461
$cert = CoyoteCert::with(new LetsEncrypt())
458
462
->storage(new FilesystemStorage('/var/certs'))
459
-
->domains('example.com')
463
+
->identifiers('example.com')
460
464
->email('admin@example.com')
461
465
->challenge(new Http01Handler('/var/www/html'))
462
466
->issueOrRenew(daysBeforeExpiry: 30);
@@ -479,7 +483,7 @@ Check whether a renewal is needed without triggering one.
479
483
```php
480
484
$coyote = CoyoteCert::with(new LetsEncrypt())
481
485
->storage(new FilesystemStorage('/var/certs'))
482
-
->domains('example.com');
486
+
->identifiers('example.com');
483
487
484
488
if ($coyote->needsRenewal(30)) {
485
489
// issue or alert
@@ -496,25 +500,50 @@ Returns `true` when:
496
500
497
501
## Wildcard and multi-domain certificates
498
502
499
-
Pass an array of domains to `->domains()`. Wildcards require DNS-01 or dns-persist-01.
503
+
Pass an array of domains to `->identifiers()`. Wildcards require DNS-01 or dns-persist-01.
`*.example.com` covers one label deep (`sub.example.com`) but not the apex (`example.com`). Include both if you need both.
516
520
517
-
`->domains()` validates every entry against RFC-compliant hostname syntax and throws an `InvalidArgumentException` immediately for malformed input, so misconfigured domain lists are caught before any CA communication starts.
521
+
`->identifiers()` validates every entry against RFC-compliant hostname syntax (or as an IP address) and throws an `AcmeException` immediately for malformed input, so misconfigured lists are caught before any CA communication starts.
522
+
523
+
---
524
+
525
+
## IP address certificates (RFC 8738)
526
+
527
+
`->identifiers()` accepts IPv4 and IPv6 addresses alongside hostnames. CoyoteCert automatically sets `type: ip` on ACME identifiers and `IP:` SAN entries in the CSR — no extra API calls required.
528
+
529
+
```php
530
+
// IPv4-only certificate (e.g. with Let's Encrypt shortlived profile)
0 commit comments