SSL certificate cannot be issued or installed: Let's Encrypt, DNS and panel fixes
Free certificates from Let's Encrypt are issued automatically, so when your hosting panel or Certbot reports that a certificate cannot be issued, or shows SSL as not available for a domain, it means the automatic check that you control the domain has failed. A certificate that cannot be installed is a different failure: the files do not match, are in the wrong format or are missing part of the chain. Either way the site stays on plain HTTP or keeps an expired certificate until it is fixed. This guide shows you how to read the error message, test the challenge path yourself, and fix the usual causes: DNS pointing elsewhere, a blocked well-known folder, CAA records, IPv6 records, rate limits and mismatched key files.
What cannot be issued actually means
Before a certificate authority signs a certificate, it must check that you control every name on it. Let's Encrypt and other automatic authorities do this with the ACME protocol, using one of two common challenges:
- HTTP-01. Your server places a small file at
http://example.com/.well-known/acme-challenge/<token>and the authority fetches it over port 80. Redirects to https are followed, so a normal HTTPS redirect is fine. - DNS-01. You publish a TXT record at
_acme-challenge.example.com. This is the only option for wildcard certificates, and it works when port 80 is closed.
The authority fetches the file or record from several places on the internet, not from your server's point of view. So if DNS is still pointing at an old host, a firewall blocks port 80 from outside, or a security rule returns a 403 for the folder, the check fails and nothing is issued. Hosting panels such as Plesk and cPanel run the same process behind a button, and when they show SSL as not available for a domain it is usually because the name does not yet resolve to that server.
A certificate that cannot be installed is different: it has been issued, but the server or panel rejects the files. That is covered further down.
Reading the error message
The error text tells you which check failed. These are the messages you are most likely to see from Let's Encrypt, Certbot or a panel:
| Message contains | What it means | Fix |
|---|---|---|
DNS problem: NXDOMAIN looking up A | The name does not exist in DNS | Create the A or CNAME record, check for typos |
Invalid response with 404 | The authority reached a server, but not the folder holding the challenge file | DNS points elsewhere, or the web root is wrong |
Invalid response with 403 | The challenge folder is blocked | Allow /.well-known/acme-challenge/ |
Timeout during connect | Port 80 is closed or filtered from the internet | Open port 80 in the firewall and any cloud security group |
CAA record for example.com prevents issuance | Your CAA record names a different authority | Add the authority to the CAA record |
too many certificates or too many failed | A rate limit has been hit | Wait, and test with staging |
Incorrect TXT record | The DNS-01 TXT value is wrong or not yet visible | Check the value and wait for the TTL |
In Plesk the message appears under the domain's SSL/TLS Certificates page after a failed request; in cPanel, open SSL/TLS Status and view the AutoSSL log for the domain. Both quote the authority's response, so look for the phrases above inside the longer text.
How to test the challenge yourself
Start with DNS. Every name on the certificate must resolve to the server that is requesting it, for both IPv4 and IPv6:
dig +short A example.com
dig +short AAAA example.com
dig +short A www.example.com
dig +short CAA example.com
Compare the A record with your server's public IP address. If there is an AAAA record, Let's Encrypt prefers IPv6, so a stale or wrong IPv6 address breaks validation even when IPv4 is right. Either fix the AAAA record so it reaches your server or remove it.
Then place a test file in the challenge folder and fetch it from outside your network:
sudo mkdir -p /var/www/example.com/.well-known/acme-challenge
echo ok | sudo tee /var/www/example.com/.well-known/acme-challenge/test
curl -i http://example.com/.well-known/acme-challenge/test
You want HTTP/1.1 200 and the body ok, or a redirect to https that ends in the same file. A 404 means the file is not where the web server looks, a 403 means a rule blocks it, and a page from a different site means DNS or the virtual host is wrong. Remove the test file afterwards.
sudo certbot certonly --dry-run -d example.com -d www.example.com while you test. Dry runs use the Let's Encrypt staging service, which has much higher limits, so repeated attempts do not lock you out of real certificates.Unblocking the well-known folder
Security rules that hide files starting with a dot are the most common reason for a 403. Add an exception before any deny rule.
nginx
location ^~ /.well-known/acme-challenge/ {
root /var/www/example.com;
default_type "text/plain";
allow all;
}
location ~ /\. { deny all; }
The ^~ prefix makes nginx use this block instead of any regular expression rule that matches dot folders. Test with sudo nginx -t and reload.
Apache and .htaccess
Place this at the top of the site's .htaccess, before WordPress or security plugin rules, so the challenge path is never rewritten:
RewriteEngine On
RewriteRule ^\.well-known/acme-challenge/ - [L]
Also check WordPress security plugins, web application firewalls and country blocking. Let's Encrypt validates from several regions, so blocking whole countries can block the authority too. Behind Cloudflare, an HTTP-01 challenge normally passes through, but a strict firewall rule, bot challenge or Under Attack mode on that path will stop it; add a rule that skips them for /.well-known/acme-challenge/, or use the DNS challenge. Cloudflare's own redirect settings are covered in Cloudflare redirects.
CAA records and rate limits
A CAA record lists which authorities may issue for your domain. If one exists and does not include your authority, issuance is refused. With no CAA records at all, any authority may issue. To allow Let's Encrypt alongside a paid authority, add a record for each:
example.com. 3600 IN CAA 0 issue "letsencrypt.org"
example.com. 3600 IN CAA 0 issuewild "letsencrypt.org"
example.com. 3600 IN CAA 0 issue "example-ca.com"
The authority checks CAA on the exact name and then on each parent, so a CAA record on a subdomain overrides the one on the main domain.
Let's Encrypt limits that small sites hit
| Limit | Roughly | How you hit it |
|---|---|---|
| Duplicate certificates for the same set of names | 5 per 7 days | Reinstalling or reissuing the same certificate over and over |
| Failed validations per name | 5 per hour per account | Clicking issue repeatedly while DNS is still wrong |
| Certificates per registered domain | 50 per 7 days | Many subdomains each with their own certificate |
Limits change from time to time, and the error message says which limit and when it resets. The cure is to stop, fix the cause, test with a dry run, and then request once.
When a certificate cannot be installed
If the authority issued the certificate but the panel or server rejects it, the files are usually the problem. Check that the certificate and the private key belong together by comparing their public keys:
openssl x509 -in cert.pem -noout -pubkey | openssl sha256
openssl pkey -in privkey.pem -pubout | openssl sha256
The two hashes must be identical. If they differ, the key is from a different request; find the key generated with the CSR, or create a new CSR and reissue. Other common install failures:
- Wrong format. Panels such as Plesk and cPanel expect PEM text that starts with
-----BEGIN CERTIFICATE-----. Windows servers expect a PFX, as covered in IIS SSL bindings. - Missing CA bundle. Paste the intermediate certificates into the CA certificate box, or the site will install but show as untrusted on some devices; see untrusted certificate fixes.
- Encrypted private key. A key beginning
-----BEGIN ENCRYPTED PRIVATE KEY-----must be decrypted before most panels accept it. - Domain not added. The panel only installs certificates for domains it hosts. Add the domain or subdomain first.
The fix, step by step
Step 1
Read the full error message
Open the error in your panel, the AutoSSL log or Certbot's output and find the key phrase, such as NXDOMAIN, Invalid response, Timeout during connect, CAA or too many. That phrase names the failed check. Note every hostname the request included, because one failing name, often www or webmail, blocks the whole certificate. Do not keep clicking issue while you investigate, because repeated failures count towards the rate limit.
Step 2
Point every name at the server
Run dig +short A and dig +short AAAA for each hostname and compare the answers with your server's public addresses. Fix or add any missing or stale records at your DNS provider, and remove AAAA records that do not reach this server, because Let's Encrypt prefers IPv6. Wait until the old TTL has passed, then repeat the lookups from another network to confirm every name now returns the correct address.
Step 3
Open port 80 from outside
Make sure the server firewall and any cloud security group allow incoming connections on port 80 as well as 443. HTTP-01 validation always starts on port 80, even if the site redirects to https. Test from a machine outside your network with curl -I http://example.com. A response of any kind means the port is open, while a timeout means something is still blocking it. Fix that before trying again.
Step 4
Test the challenge folder
Create /.well-known/acme-challenge/test in the site's web root containing the word ok, then fetch it with curl -i http://example.com/.well-known/acme-challenge/test from outside. A 200 with ok is a pass. A 404 means the wrong web root or the wrong server, a 403 means a rule blocks it, and another site's page means a DNS or virtual host problem. Delete the test file once it passes, so nothing is left behind on the live site.
Step 5
Remove rules that block it
Add an nginx location ^~ /.well-known/acme-challenge/ block above any rule that denies dot folders, or a RewriteRule that skips the path at the top of .htaccess. Check WordPress security plugins, firewall country blocks and CDN bot or attack modes, and exempt the challenge path from each. Reload the web server and repeat the curl test until it returns 200 for every hostname on the request.
Step 6
Check CAA records
Run dig +short CAA example.com and the same for any subdomain on the request. If records exist, make sure one says issue with your authority's domain, such as letsencrypt.org, and add issuewild if you need a wildcard. If there are no CAA records at all, any authority may issue and nothing needs changing. Wait for the TTL after editing, then check the records again from another resolver.
Step 7
Run a dry run before the real request
With Certbot, run certbot certonly --dry-run with the same -d names, which tests against the staging service without using up production limits. In a panel, fix the causes first and then request once. If you hit a rate limit, the message says when it resets; wait rather than retrying. When the dry run succeeds, request the real certificate and check the panel or certbot certificates lists it.
Step 8
Check the files if install fails
If the certificate issued but will not install, compare the public key hashes of the certificate and the private key with openssl x509 -pubkey and openssl pkey -pubout, piped into openssl sha256. They must match. Use PEM text for Linux panels and a PFX for Windows, paste the intermediate certificates into the CA bundle field, and make sure the domain already exists in the panel before installing.
Step 9
Confirm it is live and renewing
Load the site in a private window and run openssl s_client -connect example.com:443 -servername example.com to check the new expiry date and Verify return code: 0 (ok). Then test renewal with certbot renew --dry-run, or check that the panel shows automatic renewal switched on. Run the security audit to confirm the certificate is valid for every hostname you use and note the next expiry date.
Edge cases worth knowing
- Just moved host. The new server cannot pass HTTP-01 until DNS points at it. Either switch DNS first and accept a short gap, or use the DNS challenge to issue in advance.
- www not resolving. Panels often add www automatically. If www has no DNS record, the whole request fails; add the record or untick www.
- Plesk webmail and mail names. Ticking the option to secure webmail adds webmail.example.com to the request, which also needs a DNS record.
- Wildcards. These always need DNS-01, so a panel offering a wildcard asks you to add a TXT record or connect its DNS. If Plesk manages your DNS, it can add the record for you.
- Issued but wrong name. If the certificate issues but browsers report the wrong name, see hostname mismatch fixes.
Keeping renewals working
Every cause above can also break a renewal months later, and Let's Encrypt certificates last 90 days or less, so renewal runs often. Run sudo certbot renew --dry-run after any change to DNS, firewall rules, security plugins or CDN settings. In Plesk and cPanel, check the renewal or AutoSSL log after such changes. When a renewal fails, the site keeps working until the old certificate expires, which gives you time to fix it if you notice. Run the security audit regularly to see the expiry date, and if the certificate installs but the site still says not secure, move on to a certificate that is installed but not working.
1. Why can my SSL certificate not be issued?
Your SSL certificate cannot be issued because the certificate authority could not confirm that you control every name on it. Most often the domain or www does not point at your server yet, port 80 is blocked from outside, or a security rule blocks the well-known challenge folder. Less often a CAA record names another authority or a rate limit has been reached. The error message names the failed check, so read it first and test that part yourself with dig or curl.
2. Why does my hosting panel say SSL certificates are not available?
A hosting panel usually says SSL certificates are not available because the domain does not resolve to that server, so the panel knows the automatic check would fail. It can also mean the domain is set up as an alias or parked domain without its own hosting, or that your plan does not include the free certificate feature. Point the domain's A record at the server, wait for DNS to update, and the option normally becomes available. If not, ask your host which plan includes it.
3. Why can my SSL certificate not be installed?
An SSL certificate cannot be installed when the certificate does not match the private key, the files are in the wrong format, or the domain is not set up on the server. Compare the public key hashes of the certificate and key with OpenSSL; if they differ, the key belongs to another request. Linux panels expect PEM text, Windows servers expect a PFX file with the key inside. Include the intermediate certificates in the CA bundle field so the chain is complete.
4. Does an HTTPS redirect stop Let's Encrypt from working?
No, an ordinary HTTPS redirect does not stop Let's Encrypt from working, because the HTTP-01 check follows redirects from port 80 to https. Problems start when the redirect goes to a different domain or server that does not hold the challenge file, when it loops, or when a CDN challenge page appears instead. If you are unsure, exempt the well-known acme-challenge path from redirects and security rules, then test it yourself with curl from outside your network.
5. What is a CAA record and can it block my certificate?
A CAA record is a DNS record that lists which certificate authorities may issue certificates for your domain, and yes, it blocks issuance by any authority not listed. If you have no CAA records, every authority may issue. If you added one for a paid authority and later switched to Let's Encrypt, add another record with issue letsencrypt.org, and issuewild if you need wildcards. Remember that a CAA record on a subdomain takes priority over the main domain's records.
6. How long do I wait after hitting a Let's Encrypt rate limit?
You wait until the time stated in the rate limit error message, which is usually between one hour and one week depending on which limit you hit. Too many failed validations for a name resets after about an hour. Too many duplicate certificates for the same set of names resets on a rolling seven day window. While you wait, fix the cause and test with Certbot dry runs, which use the staging service and do not count towards production limits.
7. Can I get a certificate before moving my site to a new host?
Yes, you can get a certificate before moving your site by using the DNS-01 challenge, which proves control through a TXT record rather than a file on the web server. This works while the domain still points at the old host. Alternatively, copy the existing certificate and key to the new server if you still have them. With HTTP-01 you must wait until DNS points at the new server, which leaves a short gap without a working certificate.
Once the certificate is issued, run the security audit to confirm it is valid for each hostname, the chain is complete and the expiry date is where you expect it.
Open Security Audit Fixes โ