@seriousme/opifex 2.4.0 → 2.4.1
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/deno/tlsServer.test.ts +1 -1
- package/dev_utils/generateCert.ts +297 -77
- package/dist/dev_utils/generateCert.d.ts +5 -4
- package/dist/dev_utils/generateCert.d.ts.map +1 -1
- package/dist/dev_utils/generateCert.js +230 -65
- package/dist/dev_utils/generateCert.js.map +1 -1
- package/dist/examples/mqtt+mqtts.test.js +1 -1
- package/dist/examples/mqtt+mqtts.test.js.map +1 -1
- package/dist/examples/mqtts.test.js +1 -1
- package/dist/examples/mqtts.test.js.map +1 -1
- package/examples/mqtt+mqtts.test.ts +1 -1
- package/examples/mqtts.test.ts +1 -1
- package/node/tlsServer.test.ts +1 -1
- package/package.json +2 -4
package/deno/tlsServer.test.ts
CHANGED
|
@@ -9,7 +9,7 @@ import { MqttServer } from "../server/mod.ts";
|
|
|
9
9
|
|
|
10
10
|
logger.level(LogLevel.info);
|
|
11
11
|
|
|
12
|
-
const { key, cert, caCert } = generateLocalhostCerts();
|
|
12
|
+
const { key, cert, caCert } = await generateLocalhostCerts();
|
|
13
13
|
|
|
14
14
|
test("Deno: Test pubSub using client and server", async () => {
|
|
15
15
|
const server = new TlsServer(
|
|
@@ -1,95 +1,315 @@
|
|
|
1
|
-
import forge from "node-forge";
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
|
-
* Generates a minimal
|
|
5
|
-
*
|
|
2
|
+
* Generates a minimal TLS certificate bundle for localhost using Web Crypto API.
|
|
3
|
+
* Uses 0 external dependencies (pure JS ASN.1 DER encoding).
|
|
4
|
+
* Do NOT use this in a production setting
|
|
6
5
|
*/
|
|
7
|
-
export function generateLocalhostCerts(): {
|
|
6
|
+
export async function generateLocalhostCerts(): Promise<{
|
|
8
7
|
caCert: string;
|
|
9
8
|
key: string;
|
|
10
9
|
cert: string;
|
|
11
10
|
fullChain: string;
|
|
12
|
-
} {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
// Hardcoded CA Attributes
|
|
29
|
-
const caAttrs = [{ name: "commonName", value: "Local Dev Root CA" }];
|
|
30
|
-
caCert.setSubject(caAttrs);
|
|
31
|
-
caCert.setIssuer(caAttrs); // Self-signed: issuer equals subject
|
|
32
|
-
|
|
33
|
-
// Critical for CA: Define basic constraints to flag this certificate as a trusted issuer
|
|
34
|
-
caCert.setExtensions([
|
|
35
|
-
{ name: "basicConstraints", cA: true, critical: true },
|
|
36
|
-
{
|
|
37
|
-
name: "keyUsage",
|
|
38
|
-
keyCertSign: true,
|
|
39
|
-
digitalSignature: true,
|
|
40
|
-
critical: true,
|
|
41
|
-
},
|
|
11
|
+
}> {
|
|
12
|
+
const algorithm: RsaHashedKeyGenParams = {
|
|
13
|
+
name: "RSASSA-PKCS1-v1_5",
|
|
14
|
+
hash: "SHA-256",
|
|
15
|
+
modulusLength: 2048,
|
|
16
|
+
publicExponent: new Uint8Array([1, 0, 1]),
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
// 1. Generate Keypairs using Web Crypto
|
|
20
|
+
const caKeys = await crypto.subtle.generateKey(algorithm, true, [
|
|
21
|
+
"sign",
|
|
22
|
+
"verify",
|
|
23
|
+
]);
|
|
24
|
+
const serverKeys = await crypto.subtle.generateKey(algorithm, true, [
|
|
25
|
+
"sign",
|
|
26
|
+
"verify",
|
|
42
27
|
]);
|
|
43
28
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
// Create server certificate for localhost, valid for a year
|
|
48
|
-
const serverCert = forge.pki.createCertificate();
|
|
49
|
-
serverCert.publicKey = serverKeys.publicKey;
|
|
50
|
-
serverCert.serialNumber = "02"; // Unique serial number within this CA scope
|
|
51
|
-
serverCert.validity.notBefore = new Date();
|
|
52
|
-
serverCert.validity.notAfter = new Date();
|
|
53
|
-
serverCert.validity.notAfter.setFullYear(
|
|
54
|
-
serverCert.validity.notBefore.getFullYear() + 1,
|
|
55
|
-
);
|
|
29
|
+
const now = new Date();
|
|
30
|
+
const nextYear = new Date(now.getTime() + 365 * 24 * 60 * 60 * 1000);
|
|
56
31
|
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
keyEncipherment: true,
|
|
69
|
-
critical: true,
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
name: "subjectAltName",
|
|
73
|
-
altNames: [
|
|
74
|
-
{ type: 2, value: "localhost" }, // type 2 = DNS
|
|
75
|
-
{ type: 7, ip: "127.0.0.1" }, // type 7 = IPv4 loopback
|
|
76
|
-
{ type: 7, ip: "::1" }, // type 7 = IPv6 loopback
|
|
77
|
-
],
|
|
78
|
-
},
|
|
79
|
-
]);
|
|
32
|
+
// 2. Generate Root CA Certificate (Self-signed)
|
|
33
|
+
const caCertDer = await createX509Cert({
|
|
34
|
+
serialNumber: 1,
|
|
35
|
+
subjectCN: "Local Dev Root CA",
|
|
36
|
+
issuerCN: "Local Dev Root CA",
|
|
37
|
+
notBefore: now,
|
|
38
|
+
notAfter: nextYear,
|
|
39
|
+
publicKey: caKeys.publicKey,
|
|
40
|
+
signingPrivateKey: caKeys.privateKey,
|
|
41
|
+
isCA: true,
|
|
42
|
+
});
|
|
80
43
|
|
|
81
|
-
//
|
|
82
|
-
|
|
44
|
+
// 3. Generate Server Certificate (Signed by Root CA)
|
|
45
|
+
const serverCertDer = await createX509Cert({
|
|
46
|
+
serialNumber: 2,
|
|
47
|
+
subjectCN: "localhost",
|
|
48
|
+
issuerCN: "Local Dev Root CA",
|
|
49
|
+
notBefore: now,
|
|
50
|
+
notAfter: nextYear,
|
|
51
|
+
publicKey: serverKeys.publicKey,
|
|
52
|
+
signingPrivateKey: caKeys.privateKey,
|
|
53
|
+
isCA: false,
|
|
54
|
+
sans: [
|
|
55
|
+
{ type: "dns", value: "localhost" },
|
|
56
|
+
{ type: "ip", value: "127.0.0.1" },
|
|
57
|
+
{ type: "ip", value: "::1" },
|
|
58
|
+
],
|
|
59
|
+
});
|
|
83
60
|
|
|
84
|
-
//
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
61
|
+
// Export Server Private Key to PKCS#8 PEM
|
|
62
|
+
const exportedPrivateKey = await crypto.subtle.exportKey(
|
|
63
|
+
"pkcs8",
|
|
64
|
+
serverKeys.privateKey,
|
|
65
|
+
);
|
|
66
|
+
const serverKeyPem = pemEncode(exportedPrivateKey, "PRIVATE KEY");
|
|
67
|
+
const caCertPem = pemEncode(caCertDer, "CERTIFICATE");
|
|
68
|
+
const serverCertPem = pemEncode(serverCertDer, "CERTIFICATE");
|
|
88
69
|
|
|
89
70
|
return {
|
|
90
71
|
caCert: caCertPem,
|
|
91
72
|
key: serverKeyPem,
|
|
92
73
|
cert: serverCertPem,
|
|
93
|
-
fullChain: `${serverCertPem}\n${caCertPem}`,
|
|
74
|
+
fullChain: `${serverCertPem}\n${caCertPem}`,
|
|
94
75
|
};
|
|
95
76
|
}
|
|
77
|
+
|
|
78
|
+
/* ====================================================================
|
|
79
|
+
Pure ASN.1 / DER Encoders (Zero-Dependency X.509 Construction)
|
|
80
|
+
==================================================================== */
|
|
81
|
+
|
|
82
|
+
interface CertOptions {
|
|
83
|
+
serialNumber: number;
|
|
84
|
+
subjectCN: string;
|
|
85
|
+
issuerCN: string;
|
|
86
|
+
notBefore: Date;
|
|
87
|
+
notAfter: Date;
|
|
88
|
+
publicKey: CryptoKey;
|
|
89
|
+
signingPrivateKey: CryptoKey;
|
|
90
|
+
isCA: boolean;
|
|
91
|
+
sans?: Array<{ type: "dns" | "ip"; value: string }>;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async function createX509Cert(opts: CertOptions): Promise<ArrayBuffer> {
|
|
95
|
+
const spkiBuffer = await crypto.subtle.exportKey("spki", opts.publicKey);
|
|
96
|
+
|
|
97
|
+
// Building Extensions
|
|
98
|
+
const extensionsList: Uint8Array[] = [];
|
|
99
|
+
|
|
100
|
+
// 1. Basic Constraints
|
|
101
|
+
const basicConstraintsValue = derSequence([
|
|
102
|
+
...(opts.isCA ? [derBoolean(true)] : []),
|
|
103
|
+
]);
|
|
104
|
+
extensionsList.push(
|
|
105
|
+
derSequence([
|
|
106
|
+
derOid("2.5.29.19"), // id-ce-basicConstraints
|
|
107
|
+
derBoolean(true), // Critical
|
|
108
|
+
derOctetString(basicConstraintsValue),
|
|
109
|
+
]),
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
// 2. Key Usage (Fixed BitString unused bits padding)
|
|
113
|
+
if (opts.isCA) {
|
|
114
|
+
// keyCertSign (bit 5) | digitalSignature (bit 0) -> 0x84, 1 unused bit in last byte (0x01)
|
|
115
|
+
extensionsList.push(
|
|
116
|
+
derSequence([
|
|
117
|
+
derOid("2.5.29.15"),
|
|
118
|
+
derBoolean(true),
|
|
119
|
+
derOctetString(derBitString(new Uint8Array([0x84]), 1)),
|
|
120
|
+
]),
|
|
121
|
+
);
|
|
122
|
+
} else {
|
|
123
|
+
// digitalSignature (bit 0) | keyEncipherment (bit 2) -> 0xa0, 5 unused bits (0x05)
|
|
124
|
+
extensionsList.push(
|
|
125
|
+
derSequence([
|
|
126
|
+
derOid("2.5.29.15"),
|
|
127
|
+
derBoolean(true),
|
|
128
|
+
derOctetString(derBitString(new Uint8Array([0xa0]), 5)),
|
|
129
|
+
]),
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// 3. Extended Key Usage (Required for TLS Server Authentication)
|
|
134
|
+
if (!opts.isCA) {
|
|
135
|
+
const ekuValue = derSequence([
|
|
136
|
+
derOid("1.3.6.1.5.5.7.3.1"), // id-kp-serverAuth
|
|
137
|
+
]);
|
|
138
|
+
extensionsList.push(
|
|
139
|
+
derSequence([
|
|
140
|
+
derOid("2.5.29.37"), // id-ce-extKeyUsage
|
|
141
|
+
derOctetString(ekuValue),
|
|
142
|
+
]),
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// 4. Subject Alternative Names (SAN)
|
|
147
|
+
if (opts.sans && opts.sans.length > 0) {
|
|
148
|
+
const sanEntries: Uint8Array[] = opts.sans.map((san) => {
|
|
149
|
+
if (san.type === "dns") {
|
|
150
|
+
return derTag(0x82, new TextEncoder().encode(san.value)); // dNSName [2]
|
|
151
|
+
} else {
|
|
152
|
+
const ipParts = san.value.includes(":")
|
|
153
|
+
? parseIPv6(san.value)
|
|
154
|
+
: san.value.split(".").map((v) => parseInt(v, 10));
|
|
155
|
+
return derTag(0x87, new Uint8Array(ipParts)); // iPAddress [7]
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
const sanValue = derSequence(sanEntries);
|
|
160
|
+
extensionsList.push(
|
|
161
|
+
derSequence([
|
|
162
|
+
derOid("2.5.29.17"), // id-ce-subjectAltName
|
|
163
|
+
derOctetString(sanValue),
|
|
164
|
+
]),
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const extensionsContainer = derTag(0xa3, derSequence(extensionsList));
|
|
169
|
+
|
|
170
|
+
// TBSCertificate (To Be Signed)
|
|
171
|
+
const tbsCert = derSequence([
|
|
172
|
+
derTag(0xa0, derInteger(2)), // Version v3 (2)
|
|
173
|
+
derInteger(opts.serialNumber),
|
|
174
|
+
derSequence([derOid("1.2.840.113549.1.1.11")]), // sha256WithRSAEncryption
|
|
175
|
+
derSequence([
|
|
176
|
+
derSet([
|
|
177
|
+
derSequence([derOid("2.5.4.3"), derPrintableString(opts.issuerCN)]),
|
|
178
|
+
]),
|
|
179
|
+
]),
|
|
180
|
+
derSequence([derUTCTime(opts.notBefore), derUTCTime(opts.notAfter)]),
|
|
181
|
+
derSequence([
|
|
182
|
+
derSet([
|
|
183
|
+
derSequence([derOid("2.5.4.3"), derPrintableString(opts.subjectCN)]),
|
|
184
|
+
]),
|
|
185
|
+
]),
|
|
186
|
+
new Uint8Array(spkiBuffer),
|
|
187
|
+
extensionsContainer,
|
|
188
|
+
]);
|
|
189
|
+
|
|
190
|
+
// Sign TBSCertificate
|
|
191
|
+
const tbsBuffer = tbsCert.buffer.slice(
|
|
192
|
+
tbsCert.byteOffset,
|
|
193
|
+
tbsCert.byteOffset + tbsCert.byteLength,
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
const signature = await crypto.subtle.sign(
|
|
197
|
+
{ name: "RSASSA-PKCS1-v1_5" },
|
|
198
|
+
opts.signingPrivateKey,
|
|
199
|
+
tbsBuffer as unknown as ArrayBuffer,
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
// Final X.509 Certificate
|
|
203
|
+
const finalSequence = derSequence([
|
|
204
|
+
tbsCert,
|
|
205
|
+
derSequence([derOid("1.2.840.113549.1.1.11")]),
|
|
206
|
+
derBitString(new Uint8Array(signature), 0),
|
|
207
|
+
]);
|
|
208
|
+
|
|
209
|
+
return finalSequence.buffer.slice(
|
|
210
|
+
finalSequence.byteOffset,
|
|
211
|
+
finalSequence.byteOffset + finalSequence.byteLength,
|
|
212
|
+
) as unknown as ArrayBuffer;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/* --- DER Primitive Encoding Helpers --- */
|
|
216
|
+
|
|
217
|
+
function concatBuffers(bufs: Uint8Array[]): Uint8Array {
|
|
218
|
+
const total = bufs.reduce((sum, b) => sum + b.length, 0);
|
|
219
|
+
const res = new Uint8Array(new ArrayBuffer(total));
|
|
220
|
+
let offset = 0;
|
|
221
|
+
for (const b of bufs) {
|
|
222
|
+
res.set(b, offset);
|
|
223
|
+
offset += b.length;
|
|
224
|
+
}
|
|
225
|
+
return res;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function derTag(tag: number, payload: Uint8Array): Uint8Array {
|
|
229
|
+
const len = payload.length;
|
|
230
|
+
let lenBytes: Uint8Array;
|
|
231
|
+
if (len < 128) {
|
|
232
|
+
lenBytes = new Uint8Array([len]);
|
|
233
|
+
} else if (len < 256) {
|
|
234
|
+
lenBytes = new Uint8Array([0x81, len]);
|
|
235
|
+
} else {
|
|
236
|
+
lenBytes = new Uint8Array([0x82, (len >> 8) & 0xff, len & 0xff]);
|
|
237
|
+
}
|
|
238
|
+
return concatBuffers([new Uint8Array([tag]), lenBytes, payload]);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function derSequence(items: Uint8Array[]): Uint8Array {
|
|
242
|
+
return derTag(0x30, concatBuffers(items));
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function derSet(items: Uint8Array[]): Uint8Array {
|
|
246
|
+
return derTag(0x31, concatBuffers(items));
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function derBoolean(val: boolean): Uint8Array {
|
|
250
|
+
return derTag(0x01, new Uint8Array([val ? 0xff : 0x00]));
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
function derInteger(val: number): Uint8Array {
|
|
254
|
+
return derTag(0x02, new Uint8Array([val]));
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
function derOctetString(val: Uint8Array): Uint8Array {
|
|
258
|
+
return derTag(0x04, val);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function derPrintableString(val: string): Uint8Array {
|
|
262
|
+
return derTag(0x13, new TextEncoder().encode(val));
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function derOid(oidStr: string): Uint8Array {
|
|
266
|
+
const parts = oidStr.split(".").map((v) => parseInt(v, 10));
|
|
267
|
+
const bytes = [parts[0]! * 40 + parts[1]!];
|
|
268
|
+
for (let i = 2; i < parts.length; i++) {
|
|
269
|
+
let v = parts[i] || 0;
|
|
270
|
+
const stack: number[] = [];
|
|
271
|
+
stack.push(v & 0x7f);
|
|
272
|
+
while ((v >>= 7) > 0) {
|
|
273
|
+
stack.push((v & 0x7f) | 0x80);
|
|
274
|
+
}
|
|
275
|
+
bytes.push(...stack.reverse());
|
|
276
|
+
}
|
|
277
|
+
return derTag(0x06, new Uint8Array(bytes));
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function derBitString(val: Uint8Array, unusedBits = 0): Uint8Array {
|
|
281
|
+
return derTag(0x03, concatBuffers([new Uint8Array([unusedBits]), val]));
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
function derUTCTime(date: Date): Uint8Array {
|
|
285
|
+
const pad = (n: number) => n.toString().padStart(2, "0");
|
|
286
|
+
const str = date.getUTCFullYear().toString().slice(-2) +
|
|
287
|
+
pad(date.getUTCMonth() + 1) +
|
|
288
|
+
pad(date.getUTCDate()) +
|
|
289
|
+
pad(date.getUTCHours()) +
|
|
290
|
+
pad(date.getUTCMinutes()) +
|
|
291
|
+
pad(date.getUTCSeconds()) +
|
|
292
|
+
"Z";
|
|
293
|
+
return derTag(0x17, new TextEncoder().encode(str));
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
function parseIPv6(ip: string): number[] {
|
|
297
|
+
const parts = ip.split("::");
|
|
298
|
+
const head = parts[0] ? parts[0].split(":").map((h) => parseInt(h, 16)) : [];
|
|
299
|
+
const tail = parts[1] ? parts[1].split(":").map((h) => parseInt(h, 16)) : [];
|
|
300
|
+
const missing = 8 - (head.length + tail.length);
|
|
301
|
+
const words = [...head, ...Array(missing).fill(0), ...tail];
|
|
302
|
+
const bytes: number[] = [];
|
|
303
|
+
for (const w of words) {
|
|
304
|
+
bytes.push((w >> 8) & 0xff, w & 0xff);
|
|
305
|
+
}
|
|
306
|
+
return bytes;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
function pemEncode(buffer: ArrayBuffer, label: string): string {
|
|
310
|
+
const base64 = btoa(String.fromCharCode(...new Uint8Array(buffer)));
|
|
311
|
+
const lines = base64.match(/.{1,64}/g) || [];
|
|
312
|
+
return `-----BEGIN ${label}-----\n${
|
|
313
|
+
lines.join("\n")
|
|
314
|
+
}\n-----END ${label}-----`;
|
|
315
|
+
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Generates a minimal
|
|
3
|
-
*
|
|
2
|
+
* Generates a minimal TLS certificate bundle for localhost using Web Crypto API.
|
|
3
|
+
* Uses 0 external dependencies (pure JS ASN.1 DER encoding).
|
|
4
|
+
* Do NOT use this in a production setting
|
|
4
5
|
*/
|
|
5
|
-
export declare function generateLocalhostCerts(): {
|
|
6
|
+
export declare function generateLocalhostCerts(): Promise<{
|
|
6
7
|
caCert: string;
|
|
7
8
|
key: string;
|
|
8
9
|
cert: string;
|
|
9
10
|
fullChain: string;
|
|
10
|
-
}
|
|
11
|
+
}>;
|
|
11
12
|
//# sourceMappingURL=generateCert.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateCert.d.ts","sourceRoot":"","sources":["../../dev_utils/generateCert.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generateCert.d.ts","sourceRoot":"","sources":["../../dev_utils/generateCert.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAiED"}
|
|
@@ -1,76 +1,241 @@
|
|
|
1
|
-
import forge from "node-forge";
|
|
2
1
|
/**
|
|
3
|
-
* Generates a minimal
|
|
4
|
-
*
|
|
2
|
+
* Generates a minimal TLS certificate bundle for localhost using Web Crypto API.
|
|
3
|
+
* Uses 0 external dependencies (pure JS ASN.1 DER encoding).
|
|
4
|
+
* Do NOT use this in a production setting
|
|
5
5
|
*/
|
|
6
|
-
export function generateLocalhostCerts() {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
caCert.validity.notAfter.setFullYear(caCert.validity.notBefore.getFullYear() + 1); // Valid for 1 year
|
|
18
|
-
// Hardcoded CA Attributes
|
|
19
|
-
const caAttrs = [{ name: "commonName", value: "Local Dev Root CA" }];
|
|
20
|
-
caCert.setSubject(caAttrs);
|
|
21
|
-
caCert.setIssuer(caAttrs); // Self-signed: issuer equals subject
|
|
22
|
-
// Critical for CA: Define basic constraints to flag this certificate as a trusted issuer
|
|
23
|
-
caCert.setExtensions([
|
|
24
|
-
{ name: "basicConstraints", cA: true, critical: true },
|
|
25
|
-
{
|
|
26
|
-
name: "keyUsage",
|
|
27
|
-
keyCertSign: true,
|
|
28
|
-
digitalSignature: true,
|
|
29
|
-
critical: true,
|
|
30
|
-
},
|
|
6
|
+
export async function generateLocalhostCerts() {
|
|
7
|
+
const algorithm = {
|
|
8
|
+
name: "RSASSA-PKCS1-v1_5",
|
|
9
|
+
hash: "SHA-256",
|
|
10
|
+
modulusLength: 2048,
|
|
11
|
+
publicExponent: new Uint8Array([1, 0, 1]),
|
|
12
|
+
};
|
|
13
|
+
// 1. Generate Keypairs using Web Crypto
|
|
14
|
+
const caKeys = await crypto.subtle.generateKey(algorithm, true, [
|
|
15
|
+
"sign",
|
|
16
|
+
"verify",
|
|
31
17
|
]);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const serverCert = forge.pki.createCertificate();
|
|
36
|
-
serverCert.publicKey = serverKeys.publicKey;
|
|
37
|
-
serverCert.serialNumber = "02"; // Unique serial number within this CA scope
|
|
38
|
-
serverCert.validity.notBefore = new Date();
|
|
39
|
-
serverCert.validity.notAfter = new Date();
|
|
40
|
-
serverCert.validity.notAfter.setFullYear(serverCert.validity.notBefore.getFullYear() + 1);
|
|
41
|
-
// Hardcoded Server Attributes
|
|
42
|
-
serverCert.setSubject([{ name: "commonName", value: "localhost" }]);
|
|
43
|
-
serverCert.setIssuer(caCert.subject.attributes); // Issued by our custom Root CA
|
|
44
|
-
// Critical for Modern TLS: X509v3 Extensions containing Subject Alternative Names (SAN)
|
|
45
|
-
// Ensures compatibility with strict TLS parsers (like Deno/rustls, Go, Node.js, and modern browsers)
|
|
46
|
-
serverCert.setExtensions([
|
|
47
|
-
{ name: "basicConstraints", cA: false, critical: true },
|
|
48
|
-
{
|
|
49
|
-
name: "keyUsage",
|
|
50
|
-
digitalSignature: true,
|
|
51
|
-
keyEncipherment: true,
|
|
52
|
-
critical: true,
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
name: "subjectAltName",
|
|
56
|
-
altNames: [
|
|
57
|
-
{ type: 2, value: "localhost" }, // type 2 = DNS
|
|
58
|
-
{ type: 7, ip: "127.0.0.1" }, // type 7 = IPv4 loopback
|
|
59
|
-
{ type: 7, ip: "::1" }, // type 7 = IPv6 loopback
|
|
60
|
-
],
|
|
61
|
-
},
|
|
18
|
+
const serverKeys = await crypto.subtle.generateKey(algorithm, true, [
|
|
19
|
+
"sign",
|
|
20
|
+
"verify",
|
|
62
21
|
]);
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
//
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
22
|
+
const now = new Date();
|
|
23
|
+
const nextYear = new Date(now.getTime() + 365 * 24 * 60 * 60 * 1000);
|
|
24
|
+
// 2. Generate Root CA Certificate (Self-signed)
|
|
25
|
+
const caCertDer = await createX509Cert({
|
|
26
|
+
serialNumber: 1,
|
|
27
|
+
subjectCN: "Local Dev Root CA",
|
|
28
|
+
issuerCN: "Local Dev Root CA",
|
|
29
|
+
notBefore: now,
|
|
30
|
+
notAfter: nextYear,
|
|
31
|
+
publicKey: caKeys.publicKey,
|
|
32
|
+
signingPrivateKey: caKeys.privateKey,
|
|
33
|
+
isCA: true,
|
|
34
|
+
});
|
|
35
|
+
// 3. Generate Server Certificate (Signed by Root CA)
|
|
36
|
+
const serverCertDer = await createX509Cert({
|
|
37
|
+
serialNumber: 2,
|
|
38
|
+
subjectCN: "localhost",
|
|
39
|
+
issuerCN: "Local Dev Root CA",
|
|
40
|
+
notBefore: now,
|
|
41
|
+
notAfter: nextYear,
|
|
42
|
+
publicKey: serverKeys.publicKey,
|
|
43
|
+
signingPrivateKey: caKeys.privateKey,
|
|
44
|
+
isCA: false,
|
|
45
|
+
sans: [
|
|
46
|
+
{ type: "dns", value: "localhost" },
|
|
47
|
+
{ type: "ip", value: "127.0.0.1" },
|
|
48
|
+
{ type: "ip", value: "::1" },
|
|
49
|
+
],
|
|
50
|
+
});
|
|
51
|
+
// Export Server Private Key to PKCS#8 PEM
|
|
52
|
+
const exportedPrivateKey = await crypto.subtle.exportKey("pkcs8", serverKeys.privateKey);
|
|
53
|
+
const serverKeyPem = pemEncode(exportedPrivateKey, "PRIVATE KEY");
|
|
54
|
+
const caCertPem = pemEncode(caCertDer, "CERTIFICATE");
|
|
55
|
+
const serverCertPem = pemEncode(serverCertDer, "CERTIFICATE");
|
|
69
56
|
return {
|
|
70
57
|
caCert: caCertPem,
|
|
71
58
|
key: serverKeyPem,
|
|
72
59
|
cert: serverCertPem,
|
|
73
|
-
fullChain: `${serverCertPem}\n${caCertPem}`,
|
|
60
|
+
fullChain: `${serverCertPem}\n${caCertPem}`,
|
|
74
61
|
};
|
|
75
62
|
}
|
|
63
|
+
async function createX509Cert(opts) {
|
|
64
|
+
const spkiBuffer = await crypto.subtle.exportKey("spki", opts.publicKey);
|
|
65
|
+
// Building Extensions
|
|
66
|
+
const extensionsList = [];
|
|
67
|
+
// 1. Basic Constraints
|
|
68
|
+
const basicConstraintsValue = derSequence([
|
|
69
|
+
...(opts.isCA ? [derBoolean(true)] : []),
|
|
70
|
+
]);
|
|
71
|
+
extensionsList.push(derSequence([
|
|
72
|
+
derOid("2.5.29.19"), // id-ce-basicConstraints
|
|
73
|
+
derBoolean(true), // Critical
|
|
74
|
+
derOctetString(basicConstraintsValue),
|
|
75
|
+
]));
|
|
76
|
+
// 2. Key Usage (Fixed BitString unused bits padding)
|
|
77
|
+
if (opts.isCA) {
|
|
78
|
+
// keyCertSign (bit 5) | digitalSignature (bit 0) -> 0x84, 1 unused bit in last byte (0x01)
|
|
79
|
+
extensionsList.push(derSequence([
|
|
80
|
+
derOid("2.5.29.15"),
|
|
81
|
+
derBoolean(true),
|
|
82
|
+
derOctetString(derBitString(new Uint8Array([0x84]), 1)),
|
|
83
|
+
]));
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// digitalSignature (bit 0) | keyEncipherment (bit 2) -> 0xa0, 5 unused bits (0x05)
|
|
87
|
+
extensionsList.push(derSequence([
|
|
88
|
+
derOid("2.5.29.15"),
|
|
89
|
+
derBoolean(true),
|
|
90
|
+
derOctetString(derBitString(new Uint8Array([0xa0]), 5)),
|
|
91
|
+
]));
|
|
92
|
+
}
|
|
93
|
+
// 3. Extended Key Usage (Required for TLS Server Authentication)
|
|
94
|
+
if (!opts.isCA) {
|
|
95
|
+
const ekuValue = derSequence([
|
|
96
|
+
derOid("1.3.6.1.5.5.7.3.1"), // id-kp-serverAuth
|
|
97
|
+
]);
|
|
98
|
+
extensionsList.push(derSequence([
|
|
99
|
+
derOid("2.5.29.37"), // id-ce-extKeyUsage
|
|
100
|
+
derOctetString(ekuValue),
|
|
101
|
+
]));
|
|
102
|
+
}
|
|
103
|
+
// 4. Subject Alternative Names (SAN)
|
|
104
|
+
if (opts.sans && opts.sans.length > 0) {
|
|
105
|
+
const sanEntries = opts.sans.map((san) => {
|
|
106
|
+
if (san.type === "dns") {
|
|
107
|
+
return derTag(0x82, new TextEncoder().encode(san.value)); // dNSName [2]
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
const ipParts = san.value.includes(":")
|
|
111
|
+
? parseIPv6(san.value)
|
|
112
|
+
: san.value.split(".").map((v) => parseInt(v, 10));
|
|
113
|
+
return derTag(0x87, new Uint8Array(ipParts)); // iPAddress [7]
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
const sanValue = derSequence(sanEntries);
|
|
117
|
+
extensionsList.push(derSequence([
|
|
118
|
+
derOid("2.5.29.17"), // id-ce-subjectAltName
|
|
119
|
+
derOctetString(sanValue),
|
|
120
|
+
]));
|
|
121
|
+
}
|
|
122
|
+
const extensionsContainer = derTag(0xa3, derSequence(extensionsList));
|
|
123
|
+
// TBSCertificate (To Be Signed)
|
|
124
|
+
const tbsCert = derSequence([
|
|
125
|
+
derTag(0xa0, derInteger(2)), // Version v3 (2)
|
|
126
|
+
derInteger(opts.serialNumber),
|
|
127
|
+
derSequence([derOid("1.2.840.113549.1.1.11")]), // sha256WithRSAEncryption
|
|
128
|
+
derSequence([
|
|
129
|
+
derSet([
|
|
130
|
+
derSequence([derOid("2.5.4.3"), derPrintableString(opts.issuerCN)]),
|
|
131
|
+
]),
|
|
132
|
+
]),
|
|
133
|
+
derSequence([derUTCTime(opts.notBefore), derUTCTime(opts.notAfter)]),
|
|
134
|
+
derSequence([
|
|
135
|
+
derSet([
|
|
136
|
+
derSequence([derOid("2.5.4.3"), derPrintableString(opts.subjectCN)]),
|
|
137
|
+
]),
|
|
138
|
+
]),
|
|
139
|
+
new Uint8Array(spkiBuffer),
|
|
140
|
+
extensionsContainer,
|
|
141
|
+
]);
|
|
142
|
+
// Sign TBSCertificate
|
|
143
|
+
const tbsBuffer = tbsCert.buffer.slice(tbsCert.byteOffset, tbsCert.byteOffset + tbsCert.byteLength);
|
|
144
|
+
const signature = await crypto.subtle.sign({ name: "RSASSA-PKCS1-v1_5" }, opts.signingPrivateKey, tbsBuffer);
|
|
145
|
+
// Final X.509 Certificate
|
|
146
|
+
const finalSequence = derSequence([
|
|
147
|
+
tbsCert,
|
|
148
|
+
derSequence([derOid("1.2.840.113549.1.1.11")]),
|
|
149
|
+
derBitString(new Uint8Array(signature), 0),
|
|
150
|
+
]);
|
|
151
|
+
return finalSequence.buffer.slice(finalSequence.byteOffset, finalSequence.byteOffset + finalSequence.byteLength);
|
|
152
|
+
}
|
|
153
|
+
/* --- DER Primitive Encoding Helpers --- */
|
|
154
|
+
function concatBuffers(bufs) {
|
|
155
|
+
const total = bufs.reduce((sum, b) => sum + b.length, 0);
|
|
156
|
+
const res = new Uint8Array(new ArrayBuffer(total));
|
|
157
|
+
let offset = 0;
|
|
158
|
+
for (const b of bufs) {
|
|
159
|
+
res.set(b, offset);
|
|
160
|
+
offset += b.length;
|
|
161
|
+
}
|
|
162
|
+
return res;
|
|
163
|
+
}
|
|
164
|
+
function derTag(tag, payload) {
|
|
165
|
+
const len = payload.length;
|
|
166
|
+
let lenBytes;
|
|
167
|
+
if (len < 128) {
|
|
168
|
+
lenBytes = new Uint8Array([len]);
|
|
169
|
+
}
|
|
170
|
+
else if (len < 256) {
|
|
171
|
+
lenBytes = new Uint8Array([0x81, len]);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
lenBytes = new Uint8Array([0x82, (len >> 8) & 0xff, len & 0xff]);
|
|
175
|
+
}
|
|
176
|
+
return concatBuffers([new Uint8Array([tag]), lenBytes, payload]);
|
|
177
|
+
}
|
|
178
|
+
function derSequence(items) {
|
|
179
|
+
return derTag(0x30, concatBuffers(items));
|
|
180
|
+
}
|
|
181
|
+
function derSet(items) {
|
|
182
|
+
return derTag(0x31, concatBuffers(items));
|
|
183
|
+
}
|
|
184
|
+
function derBoolean(val) {
|
|
185
|
+
return derTag(0x01, new Uint8Array([val ? 0xff : 0x00]));
|
|
186
|
+
}
|
|
187
|
+
function derInteger(val) {
|
|
188
|
+
return derTag(0x02, new Uint8Array([val]));
|
|
189
|
+
}
|
|
190
|
+
function derOctetString(val) {
|
|
191
|
+
return derTag(0x04, val);
|
|
192
|
+
}
|
|
193
|
+
function derPrintableString(val) {
|
|
194
|
+
return derTag(0x13, new TextEncoder().encode(val));
|
|
195
|
+
}
|
|
196
|
+
function derOid(oidStr) {
|
|
197
|
+
const parts = oidStr.split(".").map((v) => parseInt(v, 10));
|
|
198
|
+
const bytes = [parts[0] * 40 + parts[1]];
|
|
199
|
+
for (let i = 2; i < parts.length; i++) {
|
|
200
|
+
let v = parts[i] || 0;
|
|
201
|
+
const stack = [];
|
|
202
|
+
stack.push(v & 0x7f);
|
|
203
|
+
while ((v >>= 7) > 0) {
|
|
204
|
+
stack.push((v & 0x7f) | 0x80);
|
|
205
|
+
}
|
|
206
|
+
bytes.push(...stack.reverse());
|
|
207
|
+
}
|
|
208
|
+
return derTag(0x06, new Uint8Array(bytes));
|
|
209
|
+
}
|
|
210
|
+
function derBitString(val, unusedBits = 0) {
|
|
211
|
+
return derTag(0x03, concatBuffers([new Uint8Array([unusedBits]), val]));
|
|
212
|
+
}
|
|
213
|
+
function derUTCTime(date) {
|
|
214
|
+
const pad = (n) => n.toString().padStart(2, "0");
|
|
215
|
+
const str = date.getUTCFullYear().toString().slice(-2) +
|
|
216
|
+
pad(date.getUTCMonth() + 1) +
|
|
217
|
+
pad(date.getUTCDate()) +
|
|
218
|
+
pad(date.getUTCHours()) +
|
|
219
|
+
pad(date.getUTCMinutes()) +
|
|
220
|
+
pad(date.getUTCSeconds()) +
|
|
221
|
+
"Z";
|
|
222
|
+
return derTag(0x17, new TextEncoder().encode(str));
|
|
223
|
+
}
|
|
224
|
+
function parseIPv6(ip) {
|
|
225
|
+
const parts = ip.split("::");
|
|
226
|
+
const head = parts[0] ? parts[0].split(":").map((h) => parseInt(h, 16)) : [];
|
|
227
|
+
const tail = parts[1] ? parts[1].split(":").map((h) => parseInt(h, 16)) : [];
|
|
228
|
+
const missing = 8 - (head.length + tail.length);
|
|
229
|
+
const words = [...head, ...Array(missing).fill(0), ...tail];
|
|
230
|
+
const bytes = [];
|
|
231
|
+
for (const w of words) {
|
|
232
|
+
bytes.push((w >> 8) & 0xff, w & 0xff);
|
|
233
|
+
}
|
|
234
|
+
return bytes;
|
|
235
|
+
}
|
|
236
|
+
function pemEncode(buffer, label) {
|
|
237
|
+
const base64 = btoa(String.fromCharCode(...new Uint8Array(buffer)));
|
|
238
|
+
const lines = base64.match(/.{1,64}/g) || [];
|
|
239
|
+
return `-----BEGIN ${label}-----\n${lines.join("\n")}\n-----END ${label}-----`;
|
|
240
|
+
}
|
|
76
241
|
//# sourceMappingURL=generateCert.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateCert.js","sourceRoot":"","sources":["../../dev_utils/generateCert.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"generateCert.js","sourceRoot":"","sources":["../../dev_utils/generateCert.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ test("Test pubSub using TLS client and a TCP client", async function () {
|
|
|
11
11
|
// the localhost certs generate here are great for testing but lack securiity
|
|
12
12
|
// use something like LetsEncrypt for any serious server
|
|
13
13
|
// generateLocalhostCerts is a dev tool and relies on node-forge as a (dev)dependency
|
|
14
|
-
const { key, cert, caCert } = generateLocalhostCerts();
|
|
14
|
+
const { key, cert, caCert } = await generateLocalhostCerts();
|
|
15
15
|
// first create the mqttServer, so we can pass it to multiple protocol servers
|
|
16
16
|
const mqttServer = new MqttServer({});
|
|
17
17
|
const tlsServer = new TlsServer({ port: 0, key, cert }, mqttServer);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mqtt+mqtts.test.js","sourceRoot":"","sources":["../../examples/mqtt+mqtts.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAE5B,IAAI,CAAC,+CAA+C,EAAE,KAAK;IACzD,6EAA6E;IAC7E,wDAAwD;IACxD,qFAAqF;IACrF,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,sBAAsB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"mqtt+mqtts.test.js","sourceRoot":"","sources":["../../examples/mqtt+mqtts.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAE5B,IAAI,CAAC,+CAA+C,EAAE,KAAK;IACzD,6EAA6E;IAC7E,wDAAwD;IACxD,qFAAqF;IACrF,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,sBAAsB,EAAE,CAAC;IAC7D,8EAA8E;IAC9E,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAEtC,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACzD,+DAA+D;IAC/D,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,SAAS,CAAC,KAAK,EAAE,CAAC;IAElB,MAAM,CAAC,IAAI,CACT,+BAA+B,SAAS,CAAC,IAAI,cAAc,SAAS,CAAC,OAAO,EAAE,CAC/E,CAAC;IACF,MAAM,CAAC,IAAI,CACT,+BAA+B,SAAS,CAAC,IAAI,cAAc,SAAS,CAAC,OAAO,EAAE,CAC/E,CAAC;IACF,4BAA4B;IAC5B,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,KAAK,SAAS;QACjD,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;IACtB,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,KAAK,SAAS;QACjD,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;IAEtB,MAAM,SAAS,GAAG;QAChB,GAAG,EAAE,IAAI,GAAG,CAAC,WAAW,WAAW,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;QACxD,QAAQ,EAAE,mBAAmB;QAC7B,eAAe,EAAE,CAAC;QAClB,sEAAsE;QACtE,iEAAiE;QACjE,OAAO,EAAE,CAAC,MAAM,CAAC;KAClB,CAAC;IAEF,MAAM,SAAS,GAAG;QAChB,GAAG,EAAE,IAAI,GAAG,CAAC,UAAU,WAAW,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;QACvD,QAAQ,EAAE,mBAAmB;QAC7B,eAAe,EAAE,CAAC;KACnB,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC,CAAC,gCAAgC;IACnE,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;IAClC,MAAM,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1E,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE1E,MAAM,UAAU,GAAkC;QAChD,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;QAC1B,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;QAC1B,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;QAC1B,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;QAC1B,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;QAC1B,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;QAC1B,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;QAC1B,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;QAC1B,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;KAC3B,CAAC;IAEF,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9C,WAAW,EAAE,IAAI,CAAC,KAAK;QACvB,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC,CAAC,CAAC;IACJ,MAAM,SAAS,CAAC,SAAS,CAAC;QACxB,aAAa;KACd,CAAC,CAAC;IAEH,sDAAsD;IACtD,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,CAAC,KAAK;QACJ,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC9C,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YACzD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IACL,cAAc;IACd,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1D,MAAM,SAAS,CAAC,OAAO,CAAC;YACtB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;SAChC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACrC,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACrC,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAChC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAC5C,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,gGAAgG;IAChG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC/B,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACvB,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC/B,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC"}
|
|
@@ -10,7 +10,7 @@ test("Test pubSub using TLS client and server and sqlitePersistence", async func
|
|
|
10
10
|
// the localhost certs generate here are great for testing but lack securiity
|
|
11
11
|
// use something like LetsEncrypt for any serious server
|
|
12
12
|
// generateLocalhostCerts is a dev tool and relies on node-forge as a (dev)dependency
|
|
13
|
-
const { key, cert, caCert } = generateLocalhostCerts();
|
|
13
|
+
const { key, cert, caCert } = await generateLocalhostCerts();
|
|
14
14
|
const dbFile = ":memory:";
|
|
15
15
|
// .start() combines instance creation and async initialization
|
|
16
16
|
const persistence = await SqlitePersistence.start(dbFile);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mqtts.test.js","sourceRoot":"","sources":["../../examples/mqtts.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAEtE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAE5B,IAAI,CAAC,+DAA+D,EAAE,KAAK;IACzE,6EAA6E;IAC7E,wDAAwD;IACxD,qFAAqF;IACrF,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,sBAAsB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"mqtts.test.js","sourceRoot":"","sources":["../../examples/mqtts.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,7 @@ test("Test pubSub using TLS client and a TCP client", async function () {
|
|
|
14
14
|
// the localhost certs generate here are great for testing but lack securiity
|
|
15
15
|
// use something like LetsEncrypt for any serious server
|
|
16
16
|
// generateLocalhostCerts is a dev tool and relies on node-forge as a (dev)dependency
|
|
17
|
-
const { key, cert, caCert } = generateLocalhostCerts();
|
|
17
|
+
const { key, cert, caCert } = await generateLocalhostCerts();
|
|
18
18
|
// first create the mqttServer, so we can pass it to multiple protocol servers
|
|
19
19
|
const mqttServer = new MqttServer({});
|
|
20
20
|
|
package/examples/mqtts.test.ts
CHANGED
|
@@ -13,7 +13,7 @@ test("Test pubSub using TLS client and server and sqlitePersistence", async func
|
|
|
13
13
|
// the localhost certs generate here are great for testing but lack securiity
|
|
14
14
|
// use something like LetsEncrypt for any serious server
|
|
15
15
|
// generateLocalhostCerts is a dev tool and relies on node-forge as a (dev)dependency
|
|
16
|
-
const { key, cert, caCert } = generateLocalhostCerts();
|
|
16
|
+
const { key, cert, caCert } = await generateLocalhostCerts();
|
|
17
17
|
const dbFile = ":memory:";
|
|
18
18
|
// .start() combines instance creation and async initialization
|
|
19
19
|
const persistence = await SqlitePersistence.start(dbFile);
|
package/node/tlsServer.test.ts
CHANGED
|
@@ -9,7 +9,7 @@ import { MqttServer } from "../server/mod.ts";
|
|
|
9
9
|
|
|
10
10
|
logger.level(LogLevel.info);
|
|
11
11
|
|
|
12
|
-
const { key, cert, caCert } = generateLocalhostCerts();
|
|
12
|
+
const { key, cert, caCert } = await generateLocalhostCerts();
|
|
13
13
|
|
|
14
14
|
test("Test pubSub using client and server", async () => {
|
|
15
15
|
const server = new TlsServer({ port: 0, key, cert }, {});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seriousme/opifex",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.1",
|
|
4
4
|
"description": "MQTT client & server for Deno & NodeJS and Bun",
|
|
5
5
|
"author": "Hans Klunder",
|
|
6
6
|
"license": "MIT",
|
|
@@ -100,8 +100,6 @@
|
|
|
100
100
|
}
|
|
101
101
|
},
|
|
102
102
|
"devDependencies": {
|
|
103
|
-
"@types/node": "^26.6.5"
|
|
104
|
-
"@types/node-forge": "^1.3.14",
|
|
105
|
-
"node-forge": "^1.4.0"
|
|
103
|
+
"@types/node": "^26.6.5"
|
|
106
104
|
}
|
|
107
105
|
}
|