checkly 8.14.1 → 8.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai-context/context.d.ts +18 -0
- package/dist/ai-context/context.js +89 -0
- package/dist/ai-context/context.js.map +1 -1
- package/dist/ai-context/skills-command/references/configure-grpc-monitors.md +37 -0
- package/dist/ai-context/skills-command/references/configure-playwright-checks.md +5 -5
- package/dist/ai-context/skills-command/references/configure-ssl-monitors.md +39 -0
- package/dist/ai-context/skills-command/references/configure-traceroute-monitors.md +36 -0
- package/dist/ai-context/skills-command/references/configure.md +9 -0
- package/dist/commands/checks/stats.js +1 -0
- package/dist/commands/checks/stats.js.map +1 -1
- package/dist/commands/deploy.js +25 -16
- package/dist/commands/deploy.js.map +1 -1
- package/dist/constants.d.ts +4 -1
- package/dist/constants.js +3 -0
- package/dist/constants.js.map +1 -1
- package/dist/constructs/api-assertion-codegen.js +2 -2
- package/dist/constructs/api-assertion-codegen.js.map +1 -1
- package/dist/constructs/api-assertion.d.ts +3 -3
- package/dist/constructs/check-codegen.d.ts +6 -0
- package/dist/constructs/check-codegen.js +24 -0
- package/dist/constructs/check-codegen.js.map +1 -1
- package/dist/constructs/dns-assertion-codegen.js +2 -2
- package/dist/constructs/dns-assertion-codegen.js.map +1 -1
- package/dist/constructs/dns-assertion.d.ts +3 -3
- package/dist/constructs/dns-request.d.ts +2 -2
- package/dist/constructs/grpc-assertion-codegen.d.ts +3 -0
- package/dist/constructs/grpc-assertion-codegen.js +33 -0
- package/dist/constructs/grpc-assertion-codegen.js.map +1 -0
- package/dist/constructs/grpc-assertion-validation.d.ts +13 -0
- package/dist/constructs/grpc-assertion-validation.js +53 -0
- package/dist/constructs/grpc-assertion-validation.js.map +1 -0
- package/dist/constructs/grpc-assertion.d.ts +61 -0
- package/dist/constructs/grpc-assertion.js +71 -0
- package/dist/constructs/grpc-assertion.js.map +1 -0
- package/dist/constructs/grpc-monitor-codegen.d.ts +13 -0
- package/dist/constructs/grpc-monitor-codegen.js +34 -0
- package/dist/constructs/grpc-monitor-codegen.js.map +1 -0
- package/dist/constructs/grpc-monitor.d.ts +83 -0
- package/dist/constructs/grpc-monitor.js +56 -0
- package/dist/constructs/grpc-monitor.js.map +1 -0
- package/dist/constructs/grpc-request-codegen.d.ts +4 -0
- package/dist/constructs/grpc-request-codegen.js +68 -0
- package/dist/constructs/grpc-request-codegen.js.map +1 -0
- package/dist/constructs/grpc-request.d.ts +137 -0
- package/dist/constructs/grpc-request.js +2 -0
- package/dist/constructs/grpc-request.js.map +1 -0
- package/dist/constructs/icmp-assertion-codegen.js +2 -2
- package/dist/constructs/icmp-assertion-codegen.js.map +1 -1
- package/dist/constructs/icmp-assertion.d.ts +1 -1
- package/dist/constructs/icmp-request.d.ts +2 -2
- package/dist/constructs/index.d.ts +9 -0
- package/dist/constructs/index.js +9 -0
- package/dist/constructs/index.js.map +1 -1
- package/dist/constructs/internal/assertion-codegen.d.ts +11 -0
- package/dist/constructs/internal/assertion-codegen.js +39 -0
- package/dist/constructs/internal/assertion-codegen.js.map +1 -1
- package/dist/constructs/internal/assertion-validation.d.ts +3 -0
- package/dist/constructs/internal/assertion-validation.js +17 -0
- package/dist/constructs/internal/assertion-validation.js.map +1 -0
- package/dist/constructs/internal/assertion.d.ts +17 -11
- package/dist/constructs/internal/assertion.js +39 -38
- package/dist/constructs/internal/assertion.js.map +1 -1
- package/dist/constructs/internal/common-diagnostics.d.ts +1 -0
- package/dist/constructs/internal/common-diagnostics.js +14 -0
- package/dist/constructs/internal/common-diagnostics.js.map +1 -1
- package/dist/constructs/ssl-assertion-codegen.d.ts +3 -0
- package/dist/constructs/ssl-assertion-codegen.js +36 -0
- package/dist/constructs/ssl-assertion-codegen.js.map +1 -0
- package/dist/constructs/ssl-assertion-validation.d.ts +13 -0
- package/dist/constructs/ssl-assertion-validation.js +49 -0
- package/dist/constructs/ssl-assertion-validation.js.map +1 -0
- package/dist/constructs/ssl-assertion.d.ts +197 -0
- package/dist/constructs/ssl-assertion.js +267 -0
- package/dist/constructs/ssl-assertion.js.map +1 -0
- package/dist/constructs/ssl-monitor-codegen.d.ts +36 -0
- package/dist/constructs/ssl-monitor-codegen.js +51 -0
- package/dist/constructs/ssl-monitor-codegen.js.map +1 -0
- package/dist/constructs/ssl-monitor.d.ts +89 -0
- package/dist/constructs/ssl-monitor.js +73 -0
- package/dist/constructs/ssl-monitor.js.map +1 -0
- package/dist/constructs/ssl-request-codegen.d.ts +4 -0
- package/dist/constructs/ssl-request-codegen.js +48 -0
- package/dist/constructs/ssl-request-codegen.js.map +1 -0
- package/dist/constructs/ssl-request.d.ts +143 -0
- package/dist/constructs/ssl-request.js +2 -0
- package/dist/constructs/ssl-request.js.map +1 -0
- package/dist/constructs/tcp-monitor-codegen.js +2 -2
- package/dist/constructs/tcp-monitor-codegen.js.map +1 -1
- package/dist/constructs/tcp-monitor.d.ts +1 -1
- package/dist/constructs/traceroute-assertion-codegen.d.ts +3 -0
- package/dist/constructs/traceroute-assertion-codegen.js +17 -0
- package/dist/constructs/traceroute-assertion-codegen.js.map +1 -0
- package/dist/constructs/traceroute-assertion-validation.d.ts +11 -0
- package/dist/constructs/traceroute-assertion-validation.js +77 -0
- package/dist/constructs/traceroute-assertion-validation.js.map +1 -0
- package/dist/constructs/traceroute-assertion.d.ts +67 -0
- package/dist/constructs/traceroute-assertion.js +96 -0
- package/dist/constructs/traceroute-assertion.js.map +1 -0
- package/dist/constructs/traceroute-monitor-codegen.d.ts +13 -0
- package/dist/constructs/traceroute-monitor-codegen.js +34 -0
- package/dist/constructs/traceroute-monitor-codegen.js.map +1 -0
- package/dist/constructs/traceroute-monitor.d.ts +83 -0
- package/dist/constructs/traceroute-monitor.js +54 -0
- package/dist/constructs/traceroute-monitor.js.map +1 -0
- package/dist/constructs/traceroute-request-codegen.d.ts +4 -0
- package/dist/constructs/traceroute-request-codegen.js +41 -0
- package/dist/constructs/traceroute-request-codegen.js.map +1 -0
- package/dist/constructs/traceroute-request.d.ts +81 -0
- package/dist/constructs/traceroute-request.js +2 -0
- package/dist/constructs/traceroute-request.js.map +1 -0
- package/dist/constructs/url-assertion-codegen.js +2 -2
- package/dist/constructs/url-assertion-codegen.js.map +1 -1
- package/dist/formatters/assertion-line.d.ts +27 -0
- package/dist/formatters/assertion-line.js +126 -0
- package/dist/formatters/assertion-line.js.map +1 -0
- package/dist/formatters/batch-stats.js +20 -1
- package/dist/formatters/batch-stats.js.map +1 -1
- package/dist/formatters/check-result-detail.js +604 -1
- package/dist/formatters/check-result-detail.js.map +1 -1
- package/dist/helpers/cli-mode.d.ts +2 -2
- package/dist/helpers/cli-mode.js +103 -11
- package/dist/helpers/cli-mode.js.map +1 -1
- package/dist/reporters/json.d.ts +1 -0
- package/dist/reporters/json.js +58 -0
- package/dist/reporters/json.js.map +1 -1
- package/dist/reporters/util.js +192 -89
- package/dist/reporters/util.js.map +1 -1
- package/dist/rest/analytics.js +6 -0
- package/dist/rest/analytics.js.map +1 -1
- package/dist/rest/batch-analytics.d.ts +1 -0
- package/dist/rest/batch-analytics.js.map +1 -1
- package/dist/rest/check-results.d.ts +75 -1
- package/dist/rest/check-results.js.map +1 -1
- package/dist/rest/projects.d.ts +1 -1
- package/dist/services/check-parser/bundler.d.ts +6 -0
- package/dist/services/check-parser/bundler.js +8 -0
- package/dist/services/check-parser/bundler.js.map +1 -1
- package/dist/services/check-parser/cache-hash.d.ts +24 -2
- package/dist/services/check-parser/cache-hash.js +45 -3
- package/dist/services/check-parser/cache-hash.js.map +1 -1
- package/dist/services/check-parser/package-files/resolver.d.ts +6 -1
- package/dist/services/check-parser/package-files/resolver.js +19 -0
- package/dist/services/check-parser/package-files/resolver.js.map +1 -1
- package/dist/services/util.d.ts +4 -0
- package/dist/services/util.js +4 -0
- package/dist/services/util.js.map +1 -1
- package/oclif.manifest.json +9 -3
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assertion.js","sourceRoot":"","sources":["../../../src/constructs/internal/assertion.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"assertion.js","sourceRoot":"","sources":["../../../src/constructs/internal/assertion.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ type ResponseTimeProps = {
|
|
|
16
16
|
type ResponseTimeLimits = {
|
|
17
17
|
degradedResponseTime: number;
|
|
18
18
|
maxResponseTime: number;
|
|
19
|
+
defaultMaxResponseTime?: number;
|
|
19
20
|
};
|
|
20
21
|
export declare function validateResponseTimes(diagnostics: Diagnostics, props: ResponseTimeProps, limits: ResponseTimeLimits): Promise<void>;
|
|
21
22
|
export {};
|
|
@@ -80,5 +80,19 @@ export async function validateResponseTimes(diagnostics, props, limits) {
|
|
|
80
80
|
+ `The current value is ${value}.`)));
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
|
+
// When `maxResponseTime` is omitted the backend applies a per-type default, so
|
|
84
|
+
// compare `degradedResponseTime` against that effective max. This catches the
|
|
85
|
+
// case where an explicit degraded value exceeds the default max (which would
|
|
86
|
+
// otherwise pass CLI validation but produce a broken check server-side).
|
|
87
|
+
const effectiveMaxResponseTime = props.maxResponseTime ?? limits.defaultMaxResponseTime;
|
|
88
|
+
if (props.degradedResponseTime !== undefined
|
|
89
|
+
&& effectiveMaxResponseTime !== undefined
|
|
90
|
+
&& props.degradedResponseTime > effectiveMaxResponseTime) {
|
|
91
|
+
diagnostics.add(new InvalidPropertyValueDiagnostic('degradedResponseTime', new Error(props.maxResponseTime !== undefined
|
|
92
|
+
? `The value of "degradedResponseTime" must be less than or equal to "maxResponseTime".`
|
|
93
|
+
: `The value of "degradedResponseTime" must be less than or equal to the default `
|
|
94
|
+
+ `"maxResponseTime" of ${effectiveMaxResponseTime}. Set an explicit "maxResponseTime" `
|
|
95
|
+
+ `if you need a higher limit.`)));
|
|
96
|
+
}
|
|
83
97
|
}
|
|
84
98
|
//# sourceMappingURL=common-diagnostics.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common-diagnostics.js","sourceRoot":"","sources":["../../../src/constructs/internal/common-diagnostics.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"common-diagnostics.js","sourceRoot":"","sources":["../../../src/constructs/internal/common-diagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { unsupportedAssertionSource, valueForBooleanAssertion, valueForGeneralAssertion, valueForNumericAssertion, } from './internal/assertion-codegen.js';
|
|
2
|
+
const generalNoArgs = { hasProperty: false, hasRegex: false };
|
|
3
|
+
// The string sources additionally accept the MATCHES (regex) operator.
|
|
4
|
+
const generalWithMatches = { hasProperty: false, hasRegex: false, hasMatches: true };
|
|
5
|
+
export function valueForSslAssertion(genfile, assertion) {
|
|
6
|
+
genfile.namedImport('SslAssertionBuilder', 'checkly/constructs');
|
|
7
|
+
switch (assertion.source) {
|
|
8
|
+
case 'CERT_EXPIRES_IN_DAYS':
|
|
9
|
+
return valueForNumericAssertion('SslAssertionBuilder', 'certExpiresInDays', assertion);
|
|
10
|
+
case 'KEY_SIZE_BITS':
|
|
11
|
+
return valueForNumericAssertion('SslAssertionBuilder', 'keySizeBits', assertion);
|
|
12
|
+
case 'CERT_NOT_EXPIRED':
|
|
13
|
+
return valueForBooleanAssertion('SslAssertionBuilder', 'certNotExpired', assertion);
|
|
14
|
+
case 'HOSTNAME_VERIFIED':
|
|
15
|
+
return valueForBooleanAssertion('SslAssertionBuilder', 'hostnameVerified', assertion);
|
|
16
|
+
case 'CHAIN_TRUSTED':
|
|
17
|
+
return valueForBooleanAssertion('SslAssertionBuilder', 'chainTrusted', assertion);
|
|
18
|
+
case 'OCSP_STAPLED':
|
|
19
|
+
return valueForBooleanAssertion('SslAssertionBuilder', 'ocspStapled', assertion);
|
|
20
|
+
case 'TLS_VERSION':
|
|
21
|
+
return valueForGeneralAssertion('SslAssertionBuilder', 'tlsVersion', assertion, generalNoArgs);
|
|
22
|
+
case 'CIPHER_SUITE':
|
|
23
|
+
return valueForGeneralAssertion('SslAssertionBuilder', 'cipherSuite', assertion, generalWithMatches);
|
|
24
|
+
case 'ISSUER_CN':
|
|
25
|
+
return valueForGeneralAssertion('SslAssertionBuilder', 'issuerCn', assertion, generalWithMatches);
|
|
26
|
+
case 'CERT_FINGERPRINT_SHA256':
|
|
27
|
+
return valueForGeneralAssertion('SslAssertionBuilder', 'certFingerprintSha256', assertion, generalNoArgs);
|
|
28
|
+
case 'ISSUER_FINGERPRINT_SHA256':
|
|
29
|
+
return valueForGeneralAssertion('SslAssertionBuilder', 'issuerFingerprintSha256', assertion, generalNoArgs);
|
|
30
|
+
case 'SIGNATURE_ALGORITHM':
|
|
31
|
+
return valueForGeneralAssertion('SslAssertionBuilder', 'signatureAlgorithm', assertion, generalWithMatches);
|
|
32
|
+
default:
|
|
33
|
+
return unsupportedAssertionSource(assertion.source, 'SSL');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=ssl-assertion-codegen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssl-assertion-codegen.js","sourceRoot":"","sources":["../../src/constructs/ssl-assertion-codegen.ts"],"names":[],"mappings":"AACA,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,iCAAiC,CAAA;AAGxC,MAAM,aAAa,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;AAC7D,uEAAuE;AACvE,MAAM,kBAAkB,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA;AAEpF,MAAM,UAAU,oBAAoB,CAAE,OAAsB,EAAE,SAAuB;IACnF,OAAO,CAAC,WAAW,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,CAAA;IAEhE,QAAQ,SAAS,CAAC,MAAM,EAAE,CAAC;QACzB,KAAK,sBAAsB;YACzB,OAAO,wBAAwB,CAAC,qBAAqB,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAA;QACxF,KAAK,eAAe;YAClB,OAAO,wBAAwB,CAAC,qBAAqB,EAAE,aAAa,EAAE,SAAS,CAAC,CAAA;QAClF,KAAK,kBAAkB;YACrB,OAAO,wBAAwB,CAAC,qBAAqB,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAA;QACrF,KAAK,mBAAmB;YACtB,OAAO,wBAAwB,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAA;QACvF,KAAK,eAAe;YAClB,OAAO,wBAAwB,CAAC,qBAAqB,EAAE,cAAc,EAAE,SAAS,CAAC,CAAA;QACnF,KAAK,cAAc;YACjB,OAAO,wBAAwB,CAAC,qBAAqB,EAAE,aAAa,EAAE,SAAS,CAAC,CAAA;QAClF,KAAK,aAAa;YAChB,OAAO,wBAAwB,CAAC,qBAAqB,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;QAChG,KAAK,cAAc;YACjB,OAAO,wBAAwB,CAAC,qBAAqB,EAAE,aAAa,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAA;QACtG,KAAK,WAAW;YACd,OAAO,wBAAwB,CAAC,qBAAqB,EAAE,UAAU,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAA;QACnG,KAAK,yBAAyB;YAC5B,OAAO,wBAAwB,CAAC,qBAAqB,EAAE,uBAAuB,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;QAC3G,KAAK,2BAA2B;YAC9B,OAAO,wBAAwB,CAAC,qBAAqB,EAAE,yBAAyB,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;QAC7G,KAAK,qBAAqB;YACxB,OAAO,wBAAwB,CAAC,qBAAqB,EAAE,oBAAoB,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAA;QAC7G;YACE,OAAO,0BAA0B,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC9D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Diagnostics } from './diagnostics.js';
|
|
2
|
+
import { SslAssertion } from './ssl-assertion.js';
|
|
3
|
+
/**
|
|
4
|
+
* Reports SSL assertions whose source, comparison or boolean target the backend does
|
|
5
|
+
* not accept.
|
|
6
|
+
*
|
|
7
|
+
* Assertions written as plain object literals bypass SslAssertionBuilder and are
|
|
8
|
+
* type-legal, because the fields are declared as plain strings. The backend rejects
|
|
9
|
+
* an unknown source or an operator not allowed for the source with a 400; a boolean
|
|
10
|
+
* source with a non-`true`/`false` target is accepted at deploy but never matches at
|
|
11
|
+
* evaluation, so it is reported too.
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateSslAssertion(diagnostics: Diagnostics, assertion: SslAssertion, index: number): void;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { addAssertionDiagnostic, quotedKeys } from './internal/assertion-validation.js';
|
|
2
|
+
// The operators the backend accepts per source, minus the CLI-dropped
|
|
3
|
+
// GREATER_THAN_OR_EQUAL. Keyed by the source union so adding a source without a rule
|
|
4
|
+
// fails to compile.
|
|
5
|
+
const rules = {
|
|
6
|
+
CERT_EXPIRES_IN_DAYS: { comparisons: { EQUALS: true, NOT_EQUALS: true, GREATER_THAN: true, LESS_THAN: true } },
|
|
7
|
+
KEY_SIZE_BITS: { comparisons: { EQUALS: true } },
|
|
8
|
+
CERT_NOT_EXPIRED: { comparisons: { EQUALS: true }, booleanTarget: true },
|
|
9
|
+
HOSTNAME_VERIFIED: { comparisons: { EQUALS: true }, booleanTarget: true },
|
|
10
|
+
CHAIN_TRUSTED: { comparisons: { EQUALS: true }, booleanTarget: true },
|
|
11
|
+
OCSP_STAPLED: { comparisons: { EQUALS: true }, booleanTarget: true },
|
|
12
|
+
TLS_VERSION: { comparisons: { EQUALS: true } },
|
|
13
|
+
SIGNATURE_ALGORITHM: { comparisons: { EQUALS: true, MATCHES: true } },
|
|
14
|
+
CIPHER_SUITE: { comparisons: { EQUALS: true, NOT_EQUALS: true, MATCHES: true } },
|
|
15
|
+
ISSUER_CN: { comparisons: { EQUALS: true, NOT_EQUALS: true, MATCHES: true } },
|
|
16
|
+
CERT_FINGERPRINT_SHA256: { comparisons: { EQUALS: true } },
|
|
17
|
+
ISSUER_FINGERPRINT_SHA256: { comparisons: { EQUALS: true } },
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Reports SSL assertions whose source, comparison or boolean target the backend does
|
|
21
|
+
* not accept.
|
|
22
|
+
*
|
|
23
|
+
* Assertions written as plain object literals bypass SslAssertionBuilder and are
|
|
24
|
+
* type-legal, because the fields are declared as plain strings. The backend rejects
|
|
25
|
+
* an unknown source or an operator not allowed for the source with a 400; a boolean
|
|
26
|
+
* source with a non-`true`/`false` target is accepted at deploy but never matches at
|
|
27
|
+
* evaluation, so it is reported too.
|
|
28
|
+
*/
|
|
29
|
+
export function validateSslAssertion(diagnostics, assertion, index) {
|
|
30
|
+
const location = `request.assertions[${index}]`;
|
|
31
|
+
const rule = Object.hasOwn(rules, assertion.source)
|
|
32
|
+
? rules[assertion.source]
|
|
33
|
+
: undefined;
|
|
34
|
+
if (rule === undefined) {
|
|
35
|
+
addAssertionDiagnostic(diagnostics, `The assertion at "${location}" has an unknown source "${assertion.source}". `
|
|
36
|
+
+ `Expected one of ${quotedKeys(rules)}.`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (!Object.hasOwn(rule.comparisons, assertion.comparison)) {
|
|
40
|
+
addAssertionDiagnostic(diagnostics, `The ${assertion.source} assertion at "${location}" has an unsupported comparison `
|
|
41
|
+
+ `${assertion.comparison === '' ? '(none)' : `"${assertion.comparison}"`}. `
|
|
42
|
+
+ `Expected one of ${quotedKeys(rule.comparisons)}.`);
|
|
43
|
+
}
|
|
44
|
+
if (rule.booleanTarget && assertion.target !== 'true' && assertion.target !== 'false') {
|
|
45
|
+
addAssertionDiagnostic(diagnostics, `The ${assertion.source} assertion at "${location}" must compare against "true" or "false", `
|
|
46
|
+
+ `but got "${assertion.target}".`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=ssl-assertion-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssl-assertion-validation.js","sourceRoot":"","sources":["../../src/constructs/ssl-assertion-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { Assertion as CoreAssertion } from './internal/assertion.js';
|
|
2
|
+
/**
|
|
3
|
+
* Known TLS protocol versions for use with {@link SslAssertionBuilder.tlsVersion}.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```typescript
|
|
7
|
+
* SslAssertionBuilder.tlsVersion().equals(TlsVersion.TLS1_3)
|
|
8
|
+
* ```
|
|
9
|
+
*/
|
|
10
|
+
export declare const TlsVersion: {
|
|
11
|
+
readonly TLS1_0: "TLS1.0";
|
|
12
|
+
readonly TLS1_1: "TLS1.1";
|
|
13
|
+
readonly TLS1_2: "TLS1.2";
|
|
14
|
+
readonly TLS1_3: "TLS1.3";
|
|
15
|
+
};
|
|
16
|
+
export type TlsVersionValue = (typeof TlsVersion)[keyof typeof TlsVersion];
|
|
17
|
+
/**
|
|
18
|
+
* Signature algorithms as reported by Go's `x509.Certificate.SignatureAlgorithm.String()`.
|
|
19
|
+
* These are the exact values the SSL runner evaluates assertions against — use these
|
|
20
|
+
* constants (or the string literals they represent) with {@link SslAssertionBuilder.signatureAlgorithm}.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* SslAssertionBuilder.signatureAlgorithm().equals(SignatureAlgorithm.SHA256_RSA)
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare const SignatureAlgorithm: {
|
|
28
|
+
readonly MD2_RSA: "MD2-RSA";
|
|
29
|
+
readonly MD5_RSA: "MD5-RSA";
|
|
30
|
+
readonly SHA1_RSA: "SHA1-RSA";
|
|
31
|
+
readonly SHA256_RSA: "SHA256-RSA";
|
|
32
|
+
readonly SHA384_RSA: "SHA384-RSA";
|
|
33
|
+
readonly SHA512_RSA: "SHA512-RSA";
|
|
34
|
+
readonly SHA256_RSAPSS: "SHA256-RSAPSS";
|
|
35
|
+
readonly SHA384_RSAPSS: "SHA384-RSAPSS";
|
|
36
|
+
readonly SHA512_RSAPSS: "SHA512-RSAPSS";
|
|
37
|
+
readonly DSA_SHA1: "DSA-SHA1";
|
|
38
|
+
readonly DSA_SHA256: "DSA-SHA256";
|
|
39
|
+
readonly ECDSA_SHA1: "ECDSA-SHA1";
|
|
40
|
+
readonly ECDSA_SHA256: "ECDSA-SHA256";
|
|
41
|
+
readonly ECDSA_SHA384: "ECDSA-SHA384";
|
|
42
|
+
readonly ECDSA_SHA512: "ECDSA-SHA512";
|
|
43
|
+
readonly ED25519: "Ed25519";
|
|
44
|
+
};
|
|
45
|
+
export type SignatureAlgorithmValue = (typeof SignatureAlgorithm)[keyof typeof SignatureAlgorithm];
|
|
46
|
+
/**
|
|
47
|
+
* Commonly-used IANA cipher suite names for use with
|
|
48
|
+
* {@link SslAssertionBuilder.cipherSuite}. Includes TLS 1.3 suites and
|
|
49
|
+
* widely-deployed TLS 1.2 suites.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* SslAssertionBuilder.cipherSuite().equals(CipherSuite.TLS_AES_256_GCM_SHA384)
|
|
54
|
+
* SslAssertionBuilder.cipherSuite().equals(CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export declare const CipherSuite: {
|
|
58
|
+
readonly TLS_AES_128_GCM_SHA256: "TLS_AES_128_GCM_SHA256";
|
|
59
|
+
readonly TLS_AES_256_GCM_SHA384: "TLS_AES_256_GCM_SHA384";
|
|
60
|
+
readonly TLS_CHACHA20_POLY1305_SHA256: "TLS_CHACHA20_POLY1305_SHA256";
|
|
61
|
+
readonly TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256";
|
|
62
|
+
readonly TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384: "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384";
|
|
63
|
+
readonly TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256: "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256";
|
|
64
|
+
readonly TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384: "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384";
|
|
65
|
+
readonly TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256: "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256";
|
|
66
|
+
readonly TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256: "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256";
|
|
67
|
+
readonly TLS_RSA_WITH_AES_128_GCM_SHA256: "TLS_RSA_WITH_AES_128_GCM_SHA256";
|
|
68
|
+
readonly TLS_RSA_WITH_AES_256_GCM_SHA384: "TLS_RSA_WITH_AES_256_GCM_SHA384";
|
|
69
|
+
readonly TLS_RSA_WITH_AES_128_CBC_SHA256: "TLS_RSA_WITH_AES_128_CBC_SHA256";
|
|
70
|
+
readonly TLS_RSA_WITH_AES_256_CBC_SHA256: "TLS_RSA_WITH_AES_256_CBC_SHA256";
|
|
71
|
+
readonly TLS_RSA_WITH_AES_128_CBC_SHA: "TLS_RSA_WITH_AES_128_CBC_SHA";
|
|
72
|
+
readonly TLS_RSA_WITH_AES_256_CBC_SHA: "TLS_RSA_WITH_AES_256_CBC_SHA";
|
|
73
|
+
};
|
|
74
|
+
export type CipherSuiteValue = (typeof CipherSuite)[keyof typeof CipherSuite];
|
|
75
|
+
type SslAssertionSource = 'CERT_EXPIRES_IN_DAYS' | 'CERT_NOT_EXPIRED' | 'HOSTNAME_VERIFIED' | 'CHAIN_TRUSTED' | 'TLS_VERSION' | 'CIPHER_SUITE' | 'ISSUER_CN' | 'CERT_FINGERPRINT_SHA256' | 'ISSUER_FINGERPRINT_SHA256' | 'KEY_SIZE_BITS' | 'SIGNATURE_ALGORITHM' | 'OCSP_STAPLED';
|
|
76
|
+
export type SslAssertion = CoreAssertion<SslAssertionSource>;
|
|
77
|
+
/** Days until the certificate expires (numeric). */
|
|
78
|
+
declare class CertExpiresInDaysAssertionBuilder {
|
|
79
|
+
equals(target: number): SslAssertion;
|
|
80
|
+
notEquals(target: number): SslAssertion;
|
|
81
|
+
lessThan(target: number): SslAssertion;
|
|
82
|
+
greaterThan(target: number): SslAssertion;
|
|
83
|
+
}
|
|
84
|
+
/** Certificate key size in bits (numeric, exact match only). */
|
|
85
|
+
declare class KeySizeBitsAssertionBuilder {
|
|
86
|
+
equals(target: number): SslAssertion;
|
|
87
|
+
}
|
|
88
|
+
/** Whether the certificate is not expired (boolean). */
|
|
89
|
+
declare class CertNotExpiredAssertionBuilder {
|
|
90
|
+
equals(target: boolean): SslAssertion;
|
|
91
|
+
}
|
|
92
|
+
/** Whether the hostname is verified (boolean). */
|
|
93
|
+
declare class HostnameVerifiedAssertionBuilder {
|
|
94
|
+
equals(target: boolean): SslAssertion;
|
|
95
|
+
}
|
|
96
|
+
/** Whether the certificate chain is trusted (boolean). */
|
|
97
|
+
declare class ChainTrustedAssertionBuilder {
|
|
98
|
+
equals(target: boolean): SslAssertion;
|
|
99
|
+
}
|
|
100
|
+
/** Whether a stapled OCSP response was provided during the handshake (boolean). */
|
|
101
|
+
declare class OcspStapledAssertionBuilder {
|
|
102
|
+
equals(target: boolean): SslAssertion;
|
|
103
|
+
}
|
|
104
|
+
/** Negotiated TLS version — `.equals()` accepts only known TLS version strings. */
|
|
105
|
+
declare class TlsVersionAssertionBuilder {
|
|
106
|
+
equals(target: TlsVersionValue): SslAssertion;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Certificate signature algorithm. `.equals()` takes a Go
|
|
110
|
+
* `x509.Certificate.SignatureAlgorithm.String()` value; `.matches()` takes a regex.
|
|
111
|
+
*/
|
|
112
|
+
declare class SignatureAlgorithmAssertionBuilder {
|
|
113
|
+
equals(target: SignatureAlgorithmValue): SslAssertion;
|
|
114
|
+
matches(target: string): SslAssertion;
|
|
115
|
+
}
|
|
116
|
+
/** Negotiated cipher suite (string) — exact, not-equal, or regex match. */
|
|
117
|
+
declare class CipherSuiteAssertionBuilder {
|
|
118
|
+
equals(target: string): SslAssertion;
|
|
119
|
+
notEquals(target: string): SslAssertion;
|
|
120
|
+
matches(target: string): SslAssertion;
|
|
121
|
+
}
|
|
122
|
+
/** Certificate issuer common name (string) — exact, not-equal, or regex match. */
|
|
123
|
+
declare class IssuerCnAssertionBuilder {
|
|
124
|
+
equals(target: string): SslAssertion;
|
|
125
|
+
notEquals(target: string): SslAssertion;
|
|
126
|
+
matches(target: string): SslAssertion;
|
|
127
|
+
}
|
|
128
|
+
/** Certificate SHA-256 fingerprint (string, exact match only). */
|
|
129
|
+
declare class CertFingerprintSha256AssertionBuilder {
|
|
130
|
+
equals(target: string): SslAssertion;
|
|
131
|
+
}
|
|
132
|
+
/** Issuer SHA-256 fingerprint (string, exact match only). */
|
|
133
|
+
declare class IssuerFingerprintSha256AssertionBuilder {
|
|
134
|
+
equals(target: string): SslAssertion;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Builder class for creating SSL monitor assertions.
|
|
138
|
+
* Provides methods to create assertions for TLS certificates.
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* ```typescript
|
|
142
|
+
* // Alert when the certificate is within 30 days of expiry
|
|
143
|
+
* SslAssertionBuilder.certExpiresInDays().greaterThan(30)
|
|
144
|
+
*
|
|
145
|
+
* // Require a trusted chain and a verified hostname
|
|
146
|
+
* SslAssertionBuilder.chainTrusted().equals(true)
|
|
147
|
+
* SslAssertionBuilder.hostnameVerified().equals(true)
|
|
148
|
+
*
|
|
149
|
+
* // Enforce a specific TLS version and key size
|
|
150
|
+
* SslAssertionBuilder.tlsVersion().equals('TLS1.3')
|
|
151
|
+
* SslAssertionBuilder.keySizeBits().equals(2048)
|
|
152
|
+
*
|
|
153
|
+
* // Match the issuer or cipher suite against a regex
|
|
154
|
+
* SslAssertionBuilder.issuerCn().matches("^Let's Encrypt")
|
|
155
|
+
* SslAssertionBuilder.cipherSuite().matches('TLS_(AES|CHACHA)')
|
|
156
|
+
* ```
|
|
157
|
+
*/
|
|
158
|
+
export declare class SslAssertionBuilder {
|
|
159
|
+
/** Assertion builder for the number of days until the certificate expires. */
|
|
160
|
+
static certExpiresInDays(): CertExpiresInDaysAssertionBuilder;
|
|
161
|
+
/** Assertion builder for the certificate key size in bits. */
|
|
162
|
+
static keySizeBits(): KeySizeBitsAssertionBuilder;
|
|
163
|
+
/** Assertion builder for whether the certificate is not expired. */
|
|
164
|
+
static certNotExpired(): CertNotExpiredAssertionBuilder;
|
|
165
|
+
/** Assertion builder for whether the hostname is verified. */
|
|
166
|
+
static hostnameVerified(): HostnameVerifiedAssertionBuilder;
|
|
167
|
+
/** Assertion builder for whether the certificate chain is trusted. */
|
|
168
|
+
static chainTrusted(): ChainTrustedAssertionBuilder;
|
|
169
|
+
/**
|
|
170
|
+
* Assertion builder for the negotiated TLS version. `.equals()` accepts only the
|
|
171
|
+
* known TLS version strings — use the {@link TlsVersion} constants or the string
|
|
172
|
+
* literals `'TLS1.0'`…`'TLS1.3'`.
|
|
173
|
+
*/
|
|
174
|
+
static tlsVersion(): TlsVersionAssertionBuilder;
|
|
175
|
+
/**
|
|
176
|
+
* Assertion builder for the negotiated cipher suite. Go's `tls.CipherSuiteName()`
|
|
177
|
+
* can return hundreds of IANA names plus `0x....` hex fallbacks, so `.equals()` is
|
|
178
|
+
* unconstrained; use the {@link CipherSuite} constants for common suites, or
|
|
179
|
+
* `.matches()` with a regex pattern.
|
|
180
|
+
*/
|
|
181
|
+
static cipherSuite(): CipherSuiteAssertionBuilder;
|
|
182
|
+
/** Assertion builder for the certificate issuer common name. */
|
|
183
|
+
static issuerCn(): IssuerCnAssertionBuilder;
|
|
184
|
+
/** Assertion builder for the certificate SHA-256 fingerprint. */
|
|
185
|
+
static certFingerprintSha256(): CertFingerprintSha256AssertionBuilder;
|
|
186
|
+
/** Assertion builder for the issuer SHA-256 fingerprint. */
|
|
187
|
+
static issuerFingerprintSha256(): IssuerFingerprintSha256AssertionBuilder;
|
|
188
|
+
/**
|
|
189
|
+
* Assertion builder for the certificate signature algorithm. `.equals()` takes a
|
|
190
|
+
* Go `x509.Certificate.SignatureAlgorithm.String()` value (e.g. `'SHA256-RSA'`) —
|
|
191
|
+
* use the {@link SignatureAlgorithm} constants — or `.matches()` with a regex.
|
|
192
|
+
*/
|
|
193
|
+
static signatureAlgorithm(): SignatureAlgorithmAssertionBuilder;
|
|
194
|
+
/** Assertion builder for whether a stapled OCSP response was provided. */
|
|
195
|
+
static ocspStapled(): OcspStapledAssertionBuilder;
|
|
196
|
+
}
|
|
197
|
+
export {};
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { toAssertion } from './internal/assertion.js';
|
|
2
|
+
/**
|
|
3
|
+
* Known TLS protocol versions for use with {@link SslAssertionBuilder.tlsVersion}.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```typescript
|
|
7
|
+
* SslAssertionBuilder.tlsVersion().equals(TlsVersion.TLS1_3)
|
|
8
|
+
* ```
|
|
9
|
+
*/
|
|
10
|
+
export const TlsVersion = {
|
|
11
|
+
TLS1_0: 'TLS1.0',
|
|
12
|
+
TLS1_1: 'TLS1.1',
|
|
13
|
+
TLS1_2: 'TLS1.2',
|
|
14
|
+
TLS1_3: 'TLS1.3',
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Signature algorithms as reported by Go's `x509.Certificate.SignatureAlgorithm.String()`.
|
|
18
|
+
* These are the exact values the SSL runner evaluates assertions against — use these
|
|
19
|
+
* constants (or the string literals they represent) with {@link SslAssertionBuilder.signatureAlgorithm}.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* SslAssertionBuilder.signatureAlgorithm().equals(SignatureAlgorithm.SHA256_RSA)
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export const SignatureAlgorithm = {
|
|
27
|
+
// RSA
|
|
28
|
+
MD2_RSA: 'MD2-RSA',
|
|
29
|
+
MD5_RSA: 'MD5-RSA',
|
|
30
|
+
SHA1_RSA: 'SHA1-RSA',
|
|
31
|
+
SHA256_RSA: 'SHA256-RSA',
|
|
32
|
+
SHA384_RSA: 'SHA384-RSA',
|
|
33
|
+
SHA512_RSA: 'SHA512-RSA',
|
|
34
|
+
SHA256_RSAPSS: 'SHA256-RSAPSS',
|
|
35
|
+
SHA384_RSAPSS: 'SHA384-RSAPSS',
|
|
36
|
+
SHA512_RSAPSS: 'SHA512-RSAPSS',
|
|
37
|
+
// DSA
|
|
38
|
+
DSA_SHA1: 'DSA-SHA1',
|
|
39
|
+
DSA_SHA256: 'DSA-SHA256',
|
|
40
|
+
// ECDSA
|
|
41
|
+
ECDSA_SHA1: 'ECDSA-SHA1',
|
|
42
|
+
ECDSA_SHA256: 'ECDSA-SHA256',
|
|
43
|
+
ECDSA_SHA384: 'ECDSA-SHA384',
|
|
44
|
+
ECDSA_SHA512: 'ECDSA-SHA512',
|
|
45
|
+
// EdDSA
|
|
46
|
+
ED25519: 'Ed25519',
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Commonly-used IANA cipher suite names for use with
|
|
50
|
+
* {@link SslAssertionBuilder.cipherSuite}. Includes TLS 1.3 suites and
|
|
51
|
+
* widely-deployed TLS 1.2 suites.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```typescript
|
|
55
|
+
* SslAssertionBuilder.cipherSuite().equals(CipherSuite.TLS_AES_256_GCM_SHA384)
|
|
56
|
+
* SslAssertionBuilder.cipherSuite().equals(CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export const CipherSuite = {
|
|
60
|
+
// TLS 1.3
|
|
61
|
+
TLS_AES_128_GCM_SHA256: 'TLS_AES_128_GCM_SHA256',
|
|
62
|
+
TLS_AES_256_GCM_SHA384: 'TLS_AES_256_GCM_SHA384',
|
|
63
|
+
TLS_CHACHA20_POLY1305_SHA256: 'TLS_CHACHA20_POLY1305_SHA256',
|
|
64
|
+
// TLS 1.2 — ECDHE (forward-secret, preferred)
|
|
65
|
+
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256: 'TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256',
|
|
66
|
+
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384: 'TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384',
|
|
67
|
+
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256: 'TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256',
|
|
68
|
+
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384: 'TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384',
|
|
69
|
+
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256: 'TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256',
|
|
70
|
+
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256: 'TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256',
|
|
71
|
+
// TLS 1.2 — RSA key exchange
|
|
72
|
+
TLS_RSA_WITH_AES_128_GCM_SHA256: 'TLS_RSA_WITH_AES_128_GCM_SHA256',
|
|
73
|
+
TLS_RSA_WITH_AES_256_GCM_SHA384: 'TLS_RSA_WITH_AES_256_GCM_SHA384',
|
|
74
|
+
TLS_RSA_WITH_AES_128_CBC_SHA256: 'TLS_RSA_WITH_AES_128_CBC_SHA256',
|
|
75
|
+
TLS_RSA_WITH_AES_256_CBC_SHA256: 'TLS_RSA_WITH_AES_256_CBC_SHA256',
|
|
76
|
+
TLS_RSA_WITH_AES_128_CBC_SHA: 'TLS_RSA_WITH_AES_128_CBC_SHA',
|
|
77
|
+
TLS_RSA_WITH_AES_256_CBC_SHA: 'TLS_RSA_WITH_AES_256_CBC_SHA',
|
|
78
|
+
};
|
|
79
|
+
// One builder class per SSL source, each exposing only the operators (and value
|
|
80
|
+
// type) the backend accepts for that source. The classes are stateless — the source
|
|
81
|
+
// is baked into each `toAssertion` call — and are not exported: they are reachable
|
|
82
|
+
// only through `SslAssertionBuilder`, so they stay out of the package's public API.
|
|
83
|
+
/** Days until the certificate expires (numeric). */
|
|
84
|
+
class CertExpiresInDaysAssertionBuilder {
|
|
85
|
+
equals(target) {
|
|
86
|
+
return toAssertion('CERT_EXPIRES_IN_DAYS', 'EQUALS', target);
|
|
87
|
+
}
|
|
88
|
+
notEquals(target) {
|
|
89
|
+
return toAssertion('CERT_EXPIRES_IN_DAYS', 'NOT_EQUALS', target);
|
|
90
|
+
}
|
|
91
|
+
lessThan(target) {
|
|
92
|
+
return toAssertion('CERT_EXPIRES_IN_DAYS', 'LESS_THAN', target);
|
|
93
|
+
}
|
|
94
|
+
greaterThan(target) {
|
|
95
|
+
return toAssertion('CERT_EXPIRES_IN_DAYS', 'GREATER_THAN', target);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** Certificate key size in bits (numeric, exact match only). */
|
|
99
|
+
class KeySizeBitsAssertionBuilder {
|
|
100
|
+
equals(target) {
|
|
101
|
+
return toAssertion('KEY_SIZE_BITS', 'EQUALS', target);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** Whether the certificate is not expired (boolean). */
|
|
105
|
+
class CertNotExpiredAssertionBuilder {
|
|
106
|
+
equals(target) {
|
|
107
|
+
return toAssertion('CERT_NOT_EXPIRED', 'EQUALS', target);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/** Whether the hostname is verified (boolean). */
|
|
111
|
+
class HostnameVerifiedAssertionBuilder {
|
|
112
|
+
equals(target) {
|
|
113
|
+
return toAssertion('HOSTNAME_VERIFIED', 'EQUALS', target);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Whether the certificate chain is trusted (boolean). */
|
|
117
|
+
class ChainTrustedAssertionBuilder {
|
|
118
|
+
equals(target) {
|
|
119
|
+
return toAssertion('CHAIN_TRUSTED', 'EQUALS', target);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Whether a stapled OCSP response was provided during the handshake (boolean). */
|
|
123
|
+
class OcspStapledAssertionBuilder {
|
|
124
|
+
equals(target) {
|
|
125
|
+
return toAssertion('OCSP_STAPLED', 'EQUALS', target);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/** Negotiated TLS version — `.equals()` accepts only known TLS version strings. */
|
|
129
|
+
class TlsVersionAssertionBuilder {
|
|
130
|
+
equals(target) {
|
|
131
|
+
return toAssertion('TLS_VERSION', 'EQUALS', target);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Certificate signature algorithm. `.equals()` takes a Go
|
|
136
|
+
* `x509.Certificate.SignatureAlgorithm.String()` value; `.matches()` takes a regex.
|
|
137
|
+
*/
|
|
138
|
+
class SignatureAlgorithmAssertionBuilder {
|
|
139
|
+
equals(target) {
|
|
140
|
+
return toAssertion('SIGNATURE_ALGORITHM', 'EQUALS', target);
|
|
141
|
+
}
|
|
142
|
+
matches(target) {
|
|
143
|
+
return toAssertion('SIGNATURE_ALGORITHM', 'MATCHES', target);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/** Negotiated cipher suite (string) — exact, not-equal, or regex match. */
|
|
147
|
+
class CipherSuiteAssertionBuilder {
|
|
148
|
+
equals(target) {
|
|
149
|
+
return toAssertion('CIPHER_SUITE', 'EQUALS', target);
|
|
150
|
+
}
|
|
151
|
+
notEquals(target) {
|
|
152
|
+
return toAssertion('CIPHER_SUITE', 'NOT_EQUALS', target);
|
|
153
|
+
}
|
|
154
|
+
matches(target) {
|
|
155
|
+
return toAssertion('CIPHER_SUITE', 'MATCHES', target);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/** Certificate issuer common name (string) — exact, not-equal, or regex match. */
|
|
159
|
+
class IssuerCnAssertionBuilder {
|
|
160
|
+
equals(target) {
|
|
161
|
+
return toAssertion('ISSUER_CN', 'EQUALS', target);
|
|
162
|
+
}
|
|
163
|
+
notEquals(target) {
|
|
164
|
+
return toAssertion('ISSUER_CN', 'NOT_EQUALS', target);
|
|
165
|
+
}
|
|
166
|
+
matches(target) {
|
|
167
|
+
return toAssertion('ISSUER_CN', 'MATCHES', target);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/** Certificate SHA-256 fingerprint (string, exact match only). */
|
|
171
|
+
class CertFingerprintSha256AssertionBuilder {
|
|
172
|
+
equals(target) {
|
|
173
|
+
return toAssertion('CERT_FINGERPRINT_SHA256', 'EQUALS', target);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/** Issuer SHA-256 fingerprint (string, exact match only). */
|
|
177
|
+
class IssuerFingerprintSha256AssertionBuilder {
|
|
178
|
+
equals(target) {
|
|
179
|
+
return toAssertion('ISSUER_FINGERPRINT_SHA256', 'EQUALS', target);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Builder class for creating SSL monitor assertions.
|
|
184
|
+
* Provides methods to create assertions for TLS certificates.
|
|
185
|
+
*
|
|
186
|
+
* @example
|
|
187
|
+
* ```typescript
|
|
188
|
+
* // Alert when the certificate is within 30 days of expiry
|
|
189
|
+
* SslAssertionBuilder.certExpiresInDays().greaterThan(30)
|
|
190
|
+
*
|
|
191
|
+
* // Require a trusted chain and a verified hostname
|
|
192
|
+
* SslAssertionBuilder.chainTrusted().equals(true)
|
|
193
|
+
* SslAssertionBuilder.hostnameVerified().equals(true)
|
|
194
|
+
*
|
|
195
|
+
* // Enforce a specific TLS version and key size
|
|
196
|
+
* SslAssertionBuilder.tlsVersion().equals('TLS1.3')
|
|
197
|
+
* SslAssertionBuilder.keySizeBits().equals(2048)
|
|
198
|
+
*
|
|
199
|
+
* // Match the issuer or cipher suite against a regex
|
|
200
|
+
* SslAssertionBuilder.issuerCn().matches("^Let's Encrypt")
|
|
201
|
+
* SslAssertionBuilder.cipherSuite().matches('TLS_(AES|CHACHA)')
|
|
202
|
+
* ```
|
|
203
|
+
*/
|
|
204
|
+
export class SslAssertionBuilder {
|
|
205
|
+
/** Assertion builder for the number of days until the certificate expires. */
|
|
206
|
+
static certExpiresInDays() {
|
|
207
|
+
return new CertExpiresInDaysAssertionBuilder();
|
|
208
|
+
}
|
|
209
|
+
/** Assertion builder for the certificate key size in bits. */
|
|
210
|
+
static keySizeBits() {
|
|
211
|
+
return new KeySizeBitsAssertionBuilder();
|
|
212
|
+
}
|
|
213
|
+
/** Assertion builder for whether the certificate is not expired. */
|
|
214
|
+
static certNotExpired() {
|
|
215
|
+
return new CertNotExpiredAssertionBuilder();
|
|
216
|
+
}
|
|
217
|
+
/** Assertion builder for whether the hostname is verified. */
|
|
218
|
+
static hostnameVerified() {
|
|
219
|
+
return new HostnameVerifiedAssertionBuilder();
|
|
220
|
+
}
|
|
221
|
+
/** Assertion builder for whether the certificate chain is trusted. */
|
|
222
|
+
static chainTrusted() {
|
|
223
|
+
return new ChainTrustedAssertionBuilder();
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Assertion builder for the negotiated TLS version. `.equals()` accepts only the
|
|
227
|
+
* known TLS version strings — use the {@link TlsVersion} constants or the string
|
|
228
|
+
* literals `'TLS1.0'`…`'TLS1.3'`.
|
|
229
|
+
*/
|
|
230
|
+
static tlsVersion() {
|
|
231
|
+
return new TlsVersionAssertionBuilder();
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Assertion builder for the negotiated cipher suite. Go's `tls.CipherSuiteName()`
|
|
235
|
+
* can return hundreds of IANA names plus `0x....` hex fallbacks, so `.equals()` is
|
|
236
|
+
* unconstrained; use the {@link CipherSuite} constants for common suites, or
|
|
237
|
+
* `.matches()` with a regex pattern.
|
|
238
|
+
*/
|
|
239
|
+
static cipherSuite() {
|
|
240
|
+
return new CipherSuiteAssertionBuilder();
|
|
241
|
+
}
|
|
242
|
+
/** Assertion builder for the certificate issuer common name. */
|
|
243
|
+
static issuerCn() {
|
|
244
|
+
return new IssuerCnAssertionBuilder();
|
|
245
|
+
}
|
|
246
|
+
/** Assertion builder for the certificate SHA-256 fingerprint. */
|
|
247
|
+
static certFingerprintSha256() {
|
|
248
|
+
return new CertFingerprintSha256AssertionBuilder();
|
|
249
|
+
}
|
|
250
|
+
/** Assertion builder for the issuer SHA-256 fingerprint. */
|
|
251
|
+
static issuerFingerprintSha256() {
|
|
252
|
+
return new IssuerFingerprintSha256AssertionBuilder();
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Assertion builder for the certificate signature algorithm. `.equals()` takes a
|
|
256
|
+
* Go `x509.Certificate.SignatureAlgorithm.String()` value (e.g. `'SHA256-RSA'`) —
|
|
257
|
+
* use the {@link SignatureAlgorithm} constants — or `.matches()` with a regex.
|
|
258
|
+
*/
|
|
259
|
+
static signatureAlgorithm() {
|
|
260
|
+
return new SignatureAlgorithmAssertionBuilder();
|
|
261
|
+
}
|
|
262
|
+
/** Assertion builder for whether a stapled OCSP response was provided. */
|
|
263
|
+
static ocspStapled() {
|
|
264
|
+
return new OcspStapledAssertionBuilder();
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=ssl-assertion.js.map
|