Scoring

Scoring

This document describes how sites are graded and scored.

Letter grade

The letter grade is determined first, then a numeric score (ratingInt) is computed from the grade plus success/failure bonuses.

Grades are assigned top-down; the first matching rule wins.

GradeCondition
ZNo TLS at all
TExpired, self-signed, hostname mismatch, or untrusted certificate
FRSA key < 1024 bits
FNo TLS 1.2 or 1.3 (legacy only)
CSHA1 certificate
BRSA key < 2048 bits
BCipher strength < 128 bits
BTLS 1.0 or 1.1 supported
BRC4 supported
A+PFS + no Sweet32 + no key compromise + HSTS (long max-age) + TLS 1.3
APFS + no Sweet32 + no key compromise
A-Everything else (modern TLS but minor issues)

EC and Ed25519 keys are not penalized for size (different security model than RSA).

Numeric score (ratingInt)

The base score starts from the letter grade:

base = 100 * ASCII(grade[0])
A+ → 6500 - 50 = 6450
A  → 6500
A- → 6500 + 50 = 6550
B  → 6600
...

Then adjustments are applied:

ratingInt = base
          - successScore
          + failureScore
          + softwarePenalty

Lower ratingInt is better.

Success score (subtracted from base)

Each success subtracts points (improving the score).

JSON fieldPointsDescription
autoRedirectsToSsl1HTTP → HTTPS redirect
certificateOrgMatchesRealOrganization1Cert org matches site org
contentSecurityPolicySuccess2CSP header present
daneTlsa1DANE/TLSA records exist
dnsCaa1DNS CAA records present
dnsSecSupported1DNSSEC validated (AD flag)
hpkpSuccess1HPKP (deprecated, legacy)
hstsSuccess1HSTS with max-age ≥ 6 months
hstsPreloaded1On HSTS preload list
ipv6Supported1AAAA record exists
ocspStaplingSuccess1OCSP stapling enabled
pfsSuccess1Forward secrecy supported
securityTxtSuccess1security.txt present
tls12Success1TLS 1.2 supported
tls13Success1TLS 1.3 supported
validationType = "E"2EV certificate
validationType = "D"1DV certificate

Failure score (added to base)

Each failure adds points (worsening the score).

JSON fieldPointsDescription
bleichenbacherVulnerably1Bleichenbacher
diffieVulnerably1Weak DH params
drownVulnerably1DROWN
freakVulnerably1FREAK
goldenDoodleVulnerable1GOLDENDOODLE
heartbleedVulnerably1Heartbleed
keyCompromiseImpersonationVulnerably1Key compromise
logJamVulnerably1Logjam
openSslCcsVulnerably1OpenSSL CCS
openSslLuckyMinus20Vulnerably1Lucky Minus 20
poodleVulnerably1POODLE
rc4Vulnerably1RC4
sha1Vulnerably1SHA1 signature
sleepingPoodleVulnerable1Sleeping POODLE
ssl2Vulnerably1SSL 2.0
ssl3Vulnerably1SSL 3.0
sweet32Vulnerably1Sweet32
ticketbleedVulnerably1Ticketbleed
tls10Vulnerably1TLS 1.0 supported
tls11Vulnerably1TLS 1.1 supported
zeroLengthPaddingOracleVulnerable1Zero-length padding
zombiePoodleVulnerable1Zombie POODLE

Software penalty (added to base)

ConditionPoints
serverSoftwareIsOutdated+25
serverSoftwareIsOld+50

Informational fields (no scoring)

These fields are present in the JSON but do not affect the score directly:

JSON fieldDescription
certExpiredCertificate is expired (caps grade to T)
certSelfSignedCertificate is self-signed (caps grade to T)
certHostnameMismatchHostname mismatch (caps grade to T)
certUntrustedUntrusted root CA (caps grade to T)
chainIssuesChain problems (array of strings)
certKeyTypeKey type (RSA, ECDSA, Ed25519)
certKeySizeKey size in bits
cipherStrengthSymmetric cipher bits
hstsHeaderParsed HSTS header (maxAge, includeSubDomains, preload)
keyExchangeCurveNameECDHE curve name (e.g. X25519, P-256)
sessionResumptionSuccessSession resumption works
sessionTicketSupportedSession ticket support
sessionIDSupportedSession ID support