pq-map
discovery and mapping of externally visible cryptographic identities and services using Certificate Transparency and DNS
CT estate (crt.sh certwatch DB → HTTP fallback → cache) → DNS discovery (SRV/SVCB/HTTPS, A/AAAA) → live TLS probe (rustls PQ-first, openssl fallback) → correlated text / JSON / graph output.

Usage
pq-map nbp.pl # combined text view (default)
pq-map nbp.pl --summary # certificate estate summary
pq-map nbp.pl --hosts # hostnames of valid certificates
pq-map nbp.pl --certs # CT certificate records
pq-map nbp.pl --json # full state as JSON
pq-map nbp.pl --graph # semantic graph JSON (see visualization below)
pq-map nbp.pl --refresh # force fresh CT + full re-probe
pq-map nbp.pl --no-probe # CT/DNS only, no TLS handshakes
Caches in ~/.cache/pq-map/: CT 7 days, probes 24 hours. DNS resolves every run and invalidates cached probes; failed probes are cached too. --refresh bypasses both.
Visualization
./pq-graph.sh # serves ./graph.json on :8000, opens browser
./pq-graph.sh graph.json 9000
3d-force-graph viewer
ENV vars
CT_DB_HOST=crt.shCT_DB_PORT=5432CT_DB_USER=guestCT_DB_DB=certwatchCT_DB_CONNECT_TIMEOUT=30CT_DB_QUERY_TIMEOUT=120CT_CACHE_TTL=604800PROBE_CACHE_TTL=86400PROBE_TIMEOUT=8PROBE_CONCURRENCY=32DNS_TIMEOUT=5DNS_ATTEMPTS=2DNS_CONCURRENCY=32
Build
cargo build --release # rust 1.85+, libssl-dev
cargo test
License
EUPL-1.2