Alternativa a crt.sh per enumerare sottodomini e certificati. Interroga in parallelo 14 sorgenti pubbliche, unisce e deduplica i risultati, e ti dice sempre quali sorgenti hanno risposto — così sai se il risultato è affidabile o parziale.
Nessuna dipendenza esotica: Python 3.11+, httpx, e dnspython solo per
--resolve.
pip install httpx dnspython
sudo apt install postgresql-client # per la sorgente crtsh-pg
./ctsub.py example.comcrt.sh è l'unico servizio pubblico che indicizza tutti i log Certificate Transparency con query SQL libere, ed è gestito da Sectigo come cortesia: il suo frontend web va in 502 molto spesso.
Il suo Postgres pubblico però è una via separata e assai più affidabile, e serve gli stessi dati:
psql -h crt.sh -p 5432 -U guest -d certwatchÈ la sorgente crtsh-pg, attiva per default. In test appaiati ha restituito
gli stessi 100 host del frontend web nel momento in cui quest'ultimo
funzionava — quindi non è un ripiego degradato, è lo stesso dato.
Per il resto la strategia che funziona è unire più sorgenti: quelle marcate CT leggono davvero i log dei certificati, le altre sono passive DNS o storici di scansione che spesso trovano host che i certificati non rivelano.
./ctsub.py example.com # scansione base
./ctsub.py example.com --resolve # solo host che risolvono in DNS
./ctsub.py example.com --all # include le sorgenti lente/instabili
./ctsub.py example.com -s certspotter -s crtsh # solo queste sorgenti
./ctsub.py example.com --json r.json --csv r.csv --txt hosts.txt
./ctsub.py --list-sources
./ctsub.py --serve # UI web su http://127.0.0.1:8777--resolve è quasi sempre quello che vuoi: gli aggregatori restituiscono molto
rumore (host mai esistiti, wildcard storiche, spazzatura da domini parcheggiati),
e la risoluzione DNS lo taglia via. Su kernel.org: 390 host trovati, 134
effettivamente risolvono.
--serve avvia un server locale con una pagina di ricerca. Serve un backend —
non è un capriccio: quasi nessuna di queste API manda header CORS, quindi una
pagina puramente browser-side verrebbe bloccata. Ascolta solo su 127.0.0.1;
se lo esponi in rete, mettici davanti un'autenticazione.
L'endpoint JSON è riusabile da altri script:
curl 'http://127.0.0.1:8777/api/scan?domain=example.com&resolve=1' | jq -r '.hosts[]'Stato verificato il 2026-08-11:
| Sorgente | CT | Chiave | Stato |
|---|---|---|---|
crtsh-pg |
✅ | no | ✅ la migliore senza chiave — dati crt.sh via Postgres, ~30-60s |
certspotter |
✅ | opzionale | ✅ log CT veri, paginata, veloce |
crtsh |
✅ | no | |
merklemap |
✅ | obbligatoria | 💰 indice CT completo, €49/mese, nessun free tier |
subdomain-center |
no | ✅ molti risultati, molto rumore | |
rapiddns |
no | ✅ | |
anubis |
no | ✅ | |
hackertarget |
no | ✅ quota giornaliera per IP | |
urlscan |
opzionale | ✅ a tratti 503 | |
wayback |
no | ✅ lento | |
otx |
obbligatoria | ||
securitytrails |
obbligatoria | non testata (serve chiave) | |
virustotal |
obbligatoria | non testata (serve chiave) | |
chaos |
obbligatoria | non testata (serve chiave) |
Quando nessuna sorgente CT risponde, il tool stampa un avviso esplicito: in quel caso la copertura non equivale a crt.sh e non devi trattare il risultato come esaustivo.
Tutte opzionali, tutte via variabili d'ambiente. In ordine di utilità:
| Variabile | Dove | Costo | Perché |
|---|---|---|---|
CERTSPOTTER_API_KEY |
sslmate.com/certspotter | gratis | Alza il rate limit; senza chiave si esaurisce in fretta. |
OTX_API_KEY |
otx.alienvault.com | gratis | Sblocca il passive DNS, che anonimo dà 429. |
URLSCAN_API_KEY |
urlscan.io | gratis | Alza il rate limit. |
VT_API_KEY |
virustotal.com | gratis | Free tier 4 req/min. |
CHAOS_API_KEY |
chaos.projectdiscovery.io | gratis | Dataset ProjectDiscovery. |
SECURITYTRAILS_API_KEY |
securitytrails.com | free tier | Limitato ma utile. |
MERKLEMAP_API_KEY |
merklemap.com | €49/mese | Indice CT completo. Vedi sotto prima di pagare. |
È l'indice CT più completo in circolazione, ma non ha un free tier: il
piano parte da €49/mese per 100.000 richieste. Prima di pagarlo, considera che
crtsh-pg dà accesso agli stessi log CT gratuitamente, con l'unico costo di
essere più lenta (~30-60s) e di dipendere dalla disponibilità di crt.sh.
Merklemap ha senso se ti serve latenza bassa, volumi alti, o non vuoi dipendere
dall'uptime di un servizio offerto per cortesia. Per un uso occasionale,
crtsh-pg + certspotter coprono lo stesso terreno.
export MERKLEMAP_API_KEY=...
./ctsub.py example.com # merklemap si attiva da solaSenza chiave la sorgente viene saltata e segnalata, non fallisce in silenzio.
- Le sorgenti girano in parallelo, ognuna con timeout indipendente (
-t) e un secondo tentativo automatico sugli errori 5xx transitori. Una sorgente rotta non compromette le altre. - I nomi vengono normalizzati: wildcard
*.rimosse, porte e path tagliati, email nei SAN scartate, e vengono tenuti solo gli host realmente sotto il dominio richiesto (evil-example.comnon passa perexample.com). - Usalo su domini tuoi o per cui hai autorizzazione. I dati CT sono pubblici, ma la scansione DNS massiva su terzi può violare i ToS del tuo provider.
- Cache su SQLite per non rinterrogare gli stessi domini.
certstreamper il monitoraggio live di nuovi certificati emessi.- Censys Platform API come ulteriore sorgente CT (richiede chiave).