/ โ† Security Audit Fixes / SSL cannot be issued
In this guide
  1. What cannot be issued actually means
  2. Reading the error message
  3. How to test the challenge yourself
  4. Unblocking the well-known folder
  5. CAA records and rate limits
  6. When a certificate cannot be installed
  7. The fix, step by step
  8. Edge cases worth knowing
  9. Keeping renewals working
  10. Questions and answers

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:

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 containsWhat it meansFix
DNS problem: NXDOMAIN looking up AThe name does not exist in DNSCreate the A or CNAME record, check for typos
Invalid response with 404The authority reached a server, but not the folder holding the challenge fileDNS points elsewhere, or the web root is wrong
Invalid response with 403The challenge folder is blockedAllow /.well-known/acme-challenge/
Timeout during connectPort 80 is closed or filtered from the internetOpen port 80 in the firewall and any cloud security group
CAA record for example.com prevents issuanceYour CAA record names a different authorityAdd the authority to the CAA record
too many certificates or too many failedA rate limit has been hitWait, and test with staging
Incorrect TXT recordThe DNS-01 TXT value is wrong or not yet visibleCheck 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.

๐Ÿ’ก With Certbot, run 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

LimitRoughlyHow you hit it
Duplicate certificates for the same set of names5 per 7 daysReinstalling or reissuing the same certificate over and over
Failed validations per name5 per hour per accountClicking issue repeatedly while DNS is still wrong
Certificates per registered domain50 per 7 daysMany 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:

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

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.

Questions and answers

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.

Check your certificate and its expiry date

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 โ†’
๐Ÿ’ฌ Got a problem?
Related Guides: All Security Audit Fixes  ·  SSL certificate installed but not working  ·  Fix SSL errors  ·  Fix HTTP errors in Plesk  ·  SSL certificate wrong hostname  ·  Learning Hub

About aiwebpageseo

aiwebpageseo.com is a data-driven SEO and AEO (Answer Engine Optimisation) platform providing a free suite of technical SEO tools. Rather than relying on AI-theorised assumptions, the platform analyses live URL performance, delivering objective diagnostics, page speed metrics, CLS debugging, and site crawl data alongside actionable technical tutorials.