testssl.sh es la referencia habitual para auditar la configuración TLS de un servidor, pero tiene un problema para quien quiere embeber el análisis en un producto comercial: su licencia es GPLv2. tlsscan es una reimplementación limpia de la misma especificación pública la SSL Labs Server Rating Guide escrita en Go con licencia MIT, sin ninguna dependencia externa y sin copiar una sola línea de testssl.sh.
Por qué existe tlsscan
El proyecto nació como el motor TLS de HeaderForge, una herramienta de análisis de cabeceras HTTP, pero se publicó de forma independiente para que cualquiera pueda usarlo. La razón principal es la licencia: integrar testssl.sh en un SaaS comercial tiene fricción legal por ser GPLv2. tlsscan es MIT: puedes embeber el código en cualquier proyecto, comercial o no, sin restricciones.
La segunda razón es la arquitectura. tlsscan usa solo la biblioteca estándar de Go (crypto/tls, crypto/x509, net, encoding/json), no reimplementa criptografía, y realiza handshakes reales contra el servidor para observar qué acepta. No hay suposiciones basadas en la versión del software del servidor: la información viene de la negociación directa.
Qué detecta
El escáner de configuración TLS cubre los protocolos, el certificado, los cipher suites y las vulnerabilidades conocidas:
Protocolos: TLS 1.0, 1.1, 1.2 y 1.3, cada uno con un handshake independiente verificado contra ConnectionState. Para SSLv3 envía un ClientHello artesanal a nivel de registro e inspecciona la respuesta (alimenta la detección de POODLE). Para SSLv2 usa el framing legacy de 2 bytes buscando un SSLv2 SERVER-HELLO (alimenta DROWN). En ningún caso reimplementa criptografía: solo observa si el servidor está dispuesto a negociar el protocolo.
Certificado: validez por fechas, días hasta la expiración, coincidencia de hostname, detección de autofirmado, completitud de la cadena (verificada hasta una raíz de confianza del sistema usando solo los intermedios que presenta el servidor) y tipo y bits de la clave.
Vulnerabilidades opcionales (con -vulns, más lento): POODLE, DROWN y otras sondas activas sobre protocolos legacy.
Tres formas de usarlo
El paquete comparte el mismo motor (pkg/tlsscan) independientemente de cómo se use:
Como librería Go: tlsscan.Scan(ctx, tlsscan.Options{Host: "ejemplo.com"}) devuelve un *Result con el grade (A+ a F), la puntuación numérica de 0 a 100 y todos los detalles del análisis en un struct con JSON estable como contrato.
Como CLI: tlsscan ejemplo.com para salida legible, tlsscan -json -vulns ejemplo.com para JSON con sondas de vulnerabilidades. Flags disponibles: -port, -timeout, -vulns, -json.
Como servicio HTTP: cmd/headerforge-tls levanta un servidor que escucha en 127.0.0.1:8081 por defecto, acepta POST /v1/scan con un JSON body y devuelve el Result. Incluye un guard anti-SSRF y está diseñado para comunicación por red privada o reverse proxy interno.
Compilación y despliegue
Al no tener dependencias externas, compilar un binario estático para Linux es directo:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o bin/tlsscan ./cmd/tlsscan
El binario resultante corre en cualquier Linux sin instalar Go ni ninguna librería. El código está disponible en GitHub bajo licencia MIT. Requiere Go 1.22 o posterior. Su proyecto hermano para la capa DNS es dnsscan, que evalúa DNSSEC, SPF, DMARC y MTA-STS con el mismo enfoque de licencia limpia y cero dependencias externas.
Imagen: Pexels / Pixabay
