---
name: ssllabs
description: TLS/SSL audit via Qualys SSL Labs — grade ciphers, chains, vulns
category: security
version: 1.0.0
license: Apache-2.0
origin: aiden
tags: security, ssl, tls, certificates, ssllabs, qualys, https, ciphers, heartbleed, poodle, compliance
---

# SSL Labs — TLS/SSL Deep Analysis

Qualys SSL Labs performs a comprehensive TLS/SSL scan and assigns a grade from A+ to F. It checks cipher suite strength, certificate validity and chain, protocol support (TLS 1.0–1.3), forward secrecy, and known vulnerabilities like Heartbleed, POODLE, DROWN, and LOGJAM.

**No API key required.** Scans can take 60–120 seconds for first-time analysis.

## When to Use

- Verify TLS configuration before or after a certificate renewal
- Compliance check: confirm TLS 1.0/1.1 is disabled, HSTS is set
- Incident response: check if a server is vulnerable to Heartbleed or POODLE
- User asks "what grade is my SSL?", "is the TLS cert on X valid?", "does site support TLS 1.3?"

## How to Use

### Start a scan and poll for results

```powershell
$host   = "github.com"
$apiUrl = "https://api.ssllabs.com/api/v3/analyze"

# Start new scan
$result = Invoke-RestMethod -Uri "$apiUrl`?host=$host&publish=off&startNew=on&all=done"
Write-Host "Status: $($result.status)"

# Poll until ready (may take 1-2 minutes)
while ($result.status -ne 'READY' -and $result.status -ne 'ERROR') {
    Start-Sleep -Seconds 20
    $result = Invoke-RestMethod -Uri "$apiUrl`?host=$host&publish=off&all=done"
    Write-Host "Status: $($result.status) — $(($result.endpoints | Measure-Object).Count) endpoint(s)"
}

$result.endpoints | ForEach-Object {
    Write-Host "  $($_.ipAddress)  Grade: $($_.grade)  $($_.statusMessage)"
}
```

### Check TLS protocols and known vulnerabilities

```powershell
$host   = "example.com"
$result = Invoke-RestMethod -Uri "https://api.ssllabs.com/api/v3/analyze?host=$host&publish=off&all=done"

while ($result.status -ne 'READY') {
    Start-Sleep -Seconds 15
    $result = Invoke-RestMethod -Uri "https://api.ssllabs.com/api/v3/analyze?host=$host&publish=off&all=done"
}

$ep = $result.endpoints[0]
Write-Host "Grade:      $($ep.grade)"
Write-Host "TLS protocols supported:"
$ep.details.protocols | ForEach-Object { Write-Host "  $($_.name) $($_.version)" }
Write-Host ""
Write-Host "Vulnerabilities:"
Write-Host "  Heartbleed:   $($ep.details.heartbleed)"
Write-Host "  POODLE (SSL): $($ep.details.poodleSsl)"
Write-Host "  FREAK:        $($ep.details.freak)"
Write-Host "  LOGJAM:       $($ep.details.logjam)"
Write-Host "  DROWN:        $($ep.details.drownVulnerable)"
```

### Get the direct report URL (instant — no waiting)

```powershell
$host    = "taracod.com"
$encoded = [Uri]::EscapeDataString($host)
$url     = "https://www.ssllabs.com/ssltest/analyze.html?d=$encoded&hideResults=on&ignoreMismatch=on"
Write-Host "Open in browser: $url"
Start-Process $url
```

## Examples

**"What SSL grade does github.com get?"**
→ Scan and poll — typically returns A+ in ~90 seconds.

**"Is my server vulnerable to Heartbleed?"**
→ Scan and check `endpoints[0].details.heartbleed` — should be false.

**"Does this server still support TLS 1.0?"**
→ Check `endpoints[0].details.protocols` — TLS 1.0 and 1.1 should be absent for A grade.

**"Just give me the SSL Labs link for my site"**
→ Use `quickScan` — returns the browser URL instantly without waiting.

## Cautions

- First-time scans for a new host take 60–120 seconds — cached results return in seconds
- `publish=off` is essential — without it, results appear on the public leaderboard
- SSL Labs API rate limits: 1 request per 2 seconds — do not spam the poll loop
- Scans from the same IP on the same host within 24h return cached results by default
- A READY result with `gradeTrustIgnored` different from `grade` means there is a certificate trust issue

## Requirements

- None — no API key needed
- For bulk scanning, respect the rate limits or use the direct URL and view in browser
