33 lines
1.6 KiB
TypeScript
33 lines
1.6 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
import { startEgressLab } from "@openwork/labs";
|
|
import { diagnoseTls } from "@openwork/matchers";
|
|
import { probeTls } from "../src/diagnostics.ts";
|
|
|
|
test("probeTls and diagnoseTls identify a TLS 1.3-only stall without the eval framework", async () => {
|
|
await using lab = await startEgressLab({ profile: "tls12-only" });
|
|
const url = new URL(lab.url);
|
|
const facts = await probeTls({
|
|
// The lab listens on IPv4. Keep certificate verification on the generated
|
|
// localhost identity without depending on the runner's localhost family
|
|
// preference.
|
|
host: "127.0.0.1",
|
|
port: Number(url.port),
|
|
servername: url.hostname,
|
|
// Chain verification is back on: the lab root is now generated with an
|
|
// explicit basicConstraints extension, so it is a real CA on every openssl
|
|
// build (1.1.1 silently emitted CA:FALSE before).
|
|
ca: lab.rootPem,
|
|
});
|
|
|
|
const message = JSON.stringify(facts);
|
|
assert.equal(facts.tls12.handshakeOk, true, message);
|
|
assert.equal(facts.tls12.stalled, false, message);
|
|
assert.equal(facts.tls12.chainVerified, true, message);
|
|
assert.equal(facts.tls12.protocol, "TLSv1.2", message);
|
|
assert.equal(facts.tls13.stalled, true, message);
|
|
assert.equal(facts.tls13.errorCode, "ETIMEDOUT", message);
|
|
assert.equal(diagnoseTls(facts).code, "tls_handshake_stall_tls13_only", message);
|
|
// Lab-PKI chain trust is covered by the pure matcher tests (the tls_chain_untrusted branch) and the product-diagnostics spec; it is deliberately not asserted here because it varies with the runner's OpenSSL.
|
|
});
|