Writing

IP address SSL certificate: what now works

Published 23 September 2026

You can get a publicly trusted SSL certificate for a public IPv4 or IPv6 address. Let's Encrypt made IP address certificates generally available in January 2026, and current Certbot releases can request them. They last only 160 hours (just over six days)so this is an automation feature, not a new way to manage certificates by hand.

The line between public and private

AddressPublic CA certificate?Use instead if not
Public IPv4 or IPv6 you controlYes, after control validation—
RFC 1918 private IPv4 such as 10.0.0.8NoPrivate CA or an internal DNS name
Loopback, link-local or reserved addressNoLocal development certificate or private CA
Cloud address that may be reassignedTechnically possible while controlledPrefer a stable DNS name unless the IP identity is the point

The CA/Browser Forum rules prohibit public certificate authorities from issuing for reserved IP addresses. A public CA also cannot prove control of 192.168.1.20 from the public Internet. Nothing about the 2026 change turns private addressing into a public identity system.

The address is encoded in the certificate's Subject Alternative Name as an iPAddress, not as text in a DNS-name field. That distinction is old (RFC 5280 has specified it since 2008)but broad, automated public issuance is the new part.

Why the certificate lasts six days

IP addresses are reassigned more readily than domain names. A cloud address can return to a provider's pool; an ISP allocation can change; an anycast address can be announced by a different operator. Let's Encrypt therefore requires its IP certificates to use the short-lived profile. The validity period is 160 hours.

Short life reduces the period in which a previously valid certificate can outlive control of the address. It also makes failed renewal unforgiving. A 90-day certificate commonly renews around day 60, leaving weeks to notice a broken job. A six-day certificate needs monitoring measured in hours. The wider TLS certificate lifetime schedule now caps newly issued public certificates at 200 days and reaches 47 days in 2029.

The certificate is not a substitute for address ownership. If the IP can move away from you, the service identity can move too. The short lifetime limits that risk; it does not make a transient address stable.

Which ACME challenges work

Let's Encrypt can validate an IP address with HTTP-01 on port 80 or TLS-ALPN-01 on port 443. DNS-01 cannot validate an IP address because there is no applicant-controlled DNS name on which to place the challenge record.

Firewalls, NAT and load balancers still matter. The validation request must reach the system serving the challenge for the public address. Opening port 80 on an internal server does not help if a different edge device owns the address.

Request one with Certbot

Let's Encrypt's March 2026 instructions use current Certbot with the shortlived ACME profile and the --ip-address option. Start against staging so a typo does not consume production issuance attempts:

sudo certbot certonly --staging \
  --preferred-profile shortlived \
  --webroot \
  --webroot-path /var/www/html \
  --ip-address <PUBLIC_IP>

Once staging succeeds, remove --staging. Certbot can obtain the certificate, but its current IP-certificate support does not automatically install it into every web server. Point the server at the generated fullchain.pem and privkey.pem, then reload it safely after renewal.

A Certbot IP address certificate is an ordinary X.509 certificate with an IP SAN; the unusual parts are how control is validated and how quickly it expires. The web server still loads it the same way it loads a certificate for a DNS name.

A renewal job is incomplete until four things have happened: a new certificate was issued, the service received it, the service reloaded it, and an outside client observed the new certificate. Monitoring only the ACME client's exit code misses half the path.

Verify the installed certificate

openssl s_client -connect <PUBLIC_IP>:443 </dev/null 2>/dev/null \
  | openssl x509 -noout -dates -ext subjectAltName

Look for the exact address as an IP Address entry in the SAN, then check notAfter. Do not accept a matching common name as a replacement for the IP SAN. Modern identity checks use the SAN.

Also inspect the chain from outside the host. A certificate can contain the right address and still fail because the server omitted an intermediate; unable to get local issuer certificate explains that separate failure. The Kodura SSL checker accepts public targets and reports the chain the server actually sends.

When an IP certificate is the right answer

It is usually the wrong answer for an ordinary website, a Kubernetes service, a cloud VM with an ephemeral address, or anything on a private LAN. A domain is portable between addresses, works naturally with virtual hosting, and gives people a usable service name. The fact that an IP certificate is possible does not make DNS obsolete.

Failure modes worth alerting on

SymptomLikely causeCheck
HTTP-01 timeoutPort 80 blocked or routed elsewhereFetch the challenge through the public IP from outside
Certificate issued but old one still servedWrong file path or no reloadCompare the live serial and expiry after deployment
Name mismatchAddress encoded incorrectly or another virtual host answeredInspect SAN type and the default TLS listener
Renewal suddenly rejectedAddress control or routing changedConfirm the allocation and both validation paths
Works locally, fails remotelySplit routing, NAT or an edge terminator presents another certificateCapture what the public listener actually serves

Do not respond by disabling certificate verification. That converts a precise identity failure into an encrypted connection to an unknown peer. The same warning applies when diagnosing ERR_CERT_AUTHORITY_INVALID: fix the identity or trust path rather than deleting the check.

Sources

Client support and ACME tooling are changing quickly. The commands and limitations here were checked against Let's Encrypt and Certbot guidance in September 2026.