Skip to main content

Health score

A 0-100 certificate health check from eight sub-scores: trusted chain, hostname match, expiry, revocation, TLS version and key strength.

A valid certificate can still cause trouble: a missing intermediate, an old TLS version, a weak key. The health score sums it up in one number from 0 to 100, built from eight sub-scores, so you can see what to fix. Available on Starter and Pro.

Where to find it

  • Domains shows the score and a small chart of recent checks for each domain.
  • The domain's page shows the score, the breakdown, the history and How to improve this score, most urgent first.
  • Click ↻ next to "Certificate health" to check again now. Otherwise it is checked every 30 minutes.

Colours: green from 75, amber from 50 to 75, red below 50.

The eight sub-scores

Sub-score Points What is checked
chain_trusted 20 Issued by a CA browsers trust. Self-signed or unknown CA: 0. Fatal.
hostname_match 15 The certificate covers your hostname. *.example.com covers a.example.com, not example.com or a.b.example.com. Fatal.
not_yet_valid 5 The start date has passed. If not, a clock is usually wrong. Fatal.
expiry_proximity 20 How much of the certificate's lifetime is left (see below).
revocation 10 The issuer has not revoked the certificate. Fatal.
chain_complete 10 The server sends its intermediate certificates.
tls_version 10 TLS 1.2 or 1.3, with 1.0 and 1.1 switched off. Half marks while they are still accepted.
weak_algorithms 10 SHA-256 or stronger, with an RSA key of at least 2048 bits or an EC key of at least 256 bits.
Total 100

Fatal problems cap the score at 20

Four problems are fatal: untrusted chain, wrong hostname, not yet valid, and revoked. Each one makes browsers refuse the site, so the score cannot go above 20, however good the rest is. The rest of the breakdown still shows which checks pass.

Expiry counts against the certificate's own lifetime

expiry_proximity stays at full marks while at least a third of the lifetime is left — that is when tools like certbot renew. After that it drops steadily to zero at expiry. So a 90-day Let's Encrypt certificate and a one-year certificate score the same when both are renewed on time.

Expiry caps the score in the last 30 days

The days before expiry also cap the whole score, at the same points where the domain's status turns warning and critical:

Days left Highest possible score
more than 30 no cap
30 to 8 74 (amber)
7 to 0 49 at 7 days, falling to 20 on the last day (red)
expired 20 (fatal)

So a certificate that should have been renewed already can no longer look green, however good the rest of it is. The cap goes away on the first health check after the new certificate is served.

How to raise a low score

Problem What to do
chain_trusted is 0 Self-signed or untrusted CA, common on staging hosts. Use a publicly trusted certificate.
hostname_match is 0 The certificate does not include the monitored name. Re-issue it with the right names.
revocation is 0 The issuer revoked it. Treat the key as compromised: new key, new certificate.
chain_complete is 0 The server sends only its own certificate. Serve the full chain (fullchain.pem with Let's Encrypt).
tls_version at half TLS 1.0 or 1.1 is still accepted. Switch them off in the server configuration.
weak_algorithms is 0 SHA-1 signature or a short key. Re-issue the certificate.
expiry_proximity falling, or the score capped Renewal is due. Check that it runs and that the server reloaded the new certificate.

An incomplete chain is the sneaky one: your browser has the intermediate cached and shows the site, while API clients and older devices cannot connect.

When something cannot be measured

You only lose points for problems CertWatchr has actually found:

  • No revocation list in the certificate? Full marks for revocation.
  • TLS 1.0/1.1 could not be tested? No points taken off.

API

The score, breakdown, suggestions and history are all in the API.