37 lines
1.5 KiB
JavaScript

#!/usr/bin/env node
import { probeTls } from "../src/index.js";
const args = process.argv.slice(2);
const json = args.includes("--json");
const target = args.find((argument) => !argument.startsWith("--"));
if (!target) {
console.error("Usage: npm run probe -- hostname[:port] [--json]");
process.exitCode = 2;
} else {
try {
const report = await probeTls(target);
if (json) console.log(JSON.stringify(report, null, 2));
else printReport(report);
} catch (error) {
console.error(`Probe failed: ${error.message}`);
process.exitCode = 1;
}
}
function printReport({ facts, findings, caveats }) {
console.log(`${facts.hostname}:${facts.port}${facts.validation.toUpperCase()}`);
console.log(`TLS ${facts.tls.version ?? "unknown"}; cipher ${facts.tls.cipher ?? "unknown"}`);
console.log(`Conventional trust: ${facts.tls.conventionalTrust ? "yes" : `no (${facts.tls.conventionalTrustError})`}`);
console.log("\nObserved certificate chain:");
facts.presentedChain.forEach((certificate, index) => {
console.log(`${index + 1}. ${certificate.subject}`);
console.log(` SHA-256 ${certificate.sha256}`);
console.log(` ${certificate.validFrom}${certificate.validUntil}${certificate.isCa ? " · CA" : ""}${certificate.selfSigned ? " · self-signed" : ""}`);
});
console.log("\nFindings:");
if (findings.length === 0) console.log("- No failure found by the current checks.");
else findings.forEach((item) => console.log(`- [${item.check}] ${item.summary}`));
console.log(`\nCaveat: ${caveats[0]}`);
}