opentunnel-cli 1.0.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/LICENSE +21 -0
- package/README.md +284 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +1357 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/client/NgrokClient.d.ts +40 -0
- package/dist/client/NgrokClient.d.ts.map +1 -0
- package/dist/client/NgrokClient.js +155 -0
- package/dist/client/NgrokClient.js.map +1 -0
- package/dist/client/TunnelClient.d.ts +47 -0
- package/dist/client/TunnelClient.d.ts.map +1 -0
- package/dist/client/TunnelClient.js +435 -0
- package/dist/client/TunnelClient.js.map +1 -0
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +8 -0
- package/dist/client/index.js.map +1 -0
- package/dist/dns/CloudflareDNS.d.ts +45 -0
- package/dist/dns/CloudflareDNS.d.ts.map +1 -0
- package/dist/dns/CloudflareDNS.js +286 -0
- package/dist/dns/CloudflareDNS.js.map +1 -0
- package/dist/dns/DuckDNS.d.ts +20 -0
- package/dist/dns/DuckDNS.d.ts.map +1 -0
- package/dist/dns/DuckDNS.js +109 -0
- package/dist/dns/DuckDNS.js.map +1 -0
- package/dist/dns/index.d.ts +3 -0
- package/dist/dns/index.d.ts.map +1 -0
- package/dist/dns/index.js +9 -0
- package/dist/dns/index.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/server/CertManager.d.ts +54 -0
- package/dist/server/CertManager.d.ts.map +1 -0
- package/dist/server/CertManager.js +414 -0
- package/dist/server/CertManager.js.map +1 -0
- package/dist/server/TunnelServer.d.ts +42 -0
- package/dist/server/TunnelServer.d.ts.map +1 -0
- package/dist/server/TunnelServer.js +790 -0
- package/dist/server/TunnelServer.js.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +48 -0
- package/dist/server/index.js.map +1 -0
- package/dist/shared/types.d.ts +147 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +3 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/shared/utils.d.ts +29 -0
- package/dist/shared/utils.d.ts.map +1 -0
- package/dist/shared/utils.js +135 -0
- package/dist/shared/utils.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.CertManager = void 0;
|
|
40
|
+
const acme = __importStar(require("acme-client"));
|
|
41
|
+
const crypto = __importStar(require("crypto"));
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const http = __importStar(require("http"));
|
|
45
|
+
const forge = __importStar(require("node-forge"));
|
|
46
|
+
const cloudflare_1 = __importDefault(require("cloudflare"));
|
|
47
|
+
const utils_1 = require("../shared/utils");
|
|
48
|
+
class CertManager {
|
|
49
|
+
constructor(options) {
|
|
50
|
+
this.accountKey = null;
|
|
51
|
+
this.client = null;
|
|
52
|
+
this.pendingChallenges = new Map();
|
|
53
|
+
this.pendingDnsChallenges = new Map();
|
|
54
|
+
this.cloudflare = null;
|
|
55
|
+
this.cloudflareZoneId = null;
|
|
56
|
+
this.certsDir = options.certsDir || path.join(process.cwd(), ".certs");
|
|
57
|
+
this.email = options.email || "admin@localhost";
|
|
58
|
+
this.isProduction = options.production ?? false;
|
|
59
|
+
this.logger = new utils_1.Logger("CertManager");
|
|
60
|
+
// Ensure certs directory exists
|
|
61
|
+
if (!fs.existsSync(this.certsDir)) {
|
|
62
|
+
fs.mkdirSync(this.certsDir, { recursive: true });
|
|
63
|
+
}
|
|
64
|
+
// Initialize Cloudflare if token provided
|
|
65
|
+
if (options.cloudflareToken) {
|
|
66
|
+
this.cloudflare = new cloudflare_1.default({
|
|
67
|
+
apiToken: options.cloudflareToken,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async initialize() {
|
|
72
|
+
// Load or create account key
|
|
73
|
+
const accountKeyPath = path.join(this.certsDir, "account.key");
|
|
74
|
+
if (fs.existsSync(accountKeyPath)) {
|
|
75
|
+
const keyPem = fs.readFileSync(accountKeyPath, "utf-8");
|
|
76
|
+
this.accountKey = crypto.createPrivateKey(keyPem);
|
|
77
|
+
this.logger.info("Loaded existing ACME account key");
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
const { privateKey } = crypto.generateKeyPairSync("rsa", {
|
|
81
|
+
modulusLength: 4096,
|
|
82
|
+
});
|
|
83
|
+
this.accountKey = privateKey;
|
|
84
|
+
fs.writeFileSync(accountKeyPath, privateKey.export({ type: "pkcs8", format: "pem" }));
|
|
85
|
+
this.logger.info("Generated new ACME account key");
|
|
86
|
+
}
|
|
87
|
+
// Create ACME client
|
|
88
|
+
const directoryUrl = this.isProduction
|
|
89
|
+
? acme.directory.letsencrypt.production
|
|
90
|
+
: acme.directory.letsencrypt.staging;
|
|
91
|
+
this.client = new acme.Client({
|
|
92
|
+
directoryUrl,
|
|
93
|
+
accountKey: this.accountKey.export({ type: "pkcs8", format: "pem" }),
|
|
94
|
+
});
|
|
95
|
+
this.logger.info(`ACME initialized (${this.isProduction ? "production" : "staging"})`);
|
|
96
|
+
}
|
|
97
|
+
async findCloudflareZone(domain) {
|
|
98
|
+
if (!this.cloudflare)
|
|
99
|
+
return null;
|
|
100
|
+
try {
|
|
101
|
+
// Extract root domain (e.g., "example.com" from "sub.example.com")
|
|
102
|
+
const parts = domain.split(".");
|
|
103
|
+
const rootDomain = parts.slice(-2).join(".");
|
|
104
|
+
const zones = await this.cloudflare.zones.list({ name: rootDomain });
|
|
105
|
+
if (zones.result && zones.result.length > 0) {
|
|
106
|
+
this.cloudflareZoneId = zones.result[0].id;
|
|
107
|
+
this.logger.info(`Found Cloudflare zone: ${rootDomain} (${this.cloudflareZoneId})`);
|
|
108
|
+
return this.cloudflareZoneId;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
this.logger.error(`Cloudflare zone lookup failed: ${err.message}`);
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
async getCertificate(domains) {
|
|
117
|
+
const primaryDomain = domains[0].replace("*.", "wildcard.");
|
|
118
|
+
const certPath = path.join(this.certsDir, `${primaryDomain}.crt`);
|
|
119
|
+
const keyPath = path.join(this.certsDir, `${primaryDomain}.key`);
|
|
120
|
+
const metaPath = path.join(this.certsDir, `${primaryDomain}.json`);
|
|
121
|
+
// Check if we have a valid cached certificate
|
|
122
|
+
if (fs.existsSync(certPath) && fs.existsSync(keyPath) && fs.existsSync(metaPath)) {
|
|
123
|
+
const meta = JSON.parse(fs.readFileSync(metaPath, "utf-8"));
|
|
124
|
+
const expiresAt = new Date(meta.expiresAt);
|
|
125
|
+
// If certificate is still valid (with 7 day buffer), return it
|
|
126
|
+
const sevenDaysMs = 7 * 24 * 60 * 60 * 1000;
|
|
127
|
+
if (expiresAt.getTime() - Date.now() > sevenDaysMs) {
|
|
128
|
+
this.logger.info(`Using cached certificate for ${domains[0]}`);
|
|
129
|
+
return {
|
|
130
|
+
cert: fs.readFileSync(certPath, "utf-8"),
|
|
131
|
+
key: fs.readFileSync(keyPath, "utf-8"),
|
|
132
|
+
expiresAt,
|
|
133
|
+
domains: meta.domains,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
this.logger.info(`Certificate expiring soon, renewing...`);
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
async requestCertificate(domains) {
|
|
141
|
+
if (!this.client) {
|
|
142
|
+
throw new Error("CertManager not initialized");
|
|
143
|
+
}
|
|
144
|
+
const hasWildcard = domains.some(d => d.startsWith("*."));
|
|
145
|
+
const primaryDomain = domains[0].replace("*.", "wildcard.");
|
|
146
|
+
this.logger.info(`Requesting certificate for: ${domains.join(", ")}`);
|
|
147
|
+
// Create CSR
|
|
148
|
+
const [key, csr] = await acme.crypto.createCsr({
|
|
149
|
+
commonName: domains[0],
|
|
150
|
+
altNames: domains.length > 1 ? domains.slice(1) : undefined,
|
|
151
|
+
});
|
|
152
|
+
// Determine challenge type based on whether we have wildcard and Cloudflare
|
|
153
|
+
const usesDns01 = hasWildcard && this.cloudflare;
|
|
154
|
+
if (hasWildcard && !this.cloudflare) {
|
|
155
|
+
throw new Error("Wildcard certificates require DNS-01 challenge. " +
|
|
156
|
+
"Please provide --cloudflare-token or use non-wildcard domain.");
|
|
157
|
+
}
|
|
158
|
+
// Request certificate
|
|
159
|
+
const cert = await this.client.auto({
|
|
160
|
+
csr,
|
|
161
|
+
email: this.email,
|
|
162
|
+
termsOfServiceAgreed: true,
|
|
163
|
+
challengeCreateFn: async (authz, challenge, keyAuthorization) => {
|
|
164
|
+
if (challenge.type === "dns-01" && this.cloudflare) {
|
|
165
|
+
await this.createDnsChallenge(authz.identifier.value, keyAuthorization);
|
|
166
|
+
}
|
|
167
|
+
else if (challenge.type === "http-01") {
|
|
168
|
+
this.pendingChallenges.set(challenge.token, {
|
|
169
|
+
token: challenge.token,
|
|
170
|
+
keyAuthorization,
|
|
171
|
+
});
|
|
172
|
+
this.logger.info(`HTTP-01 challenge ready for ${authz.identifier.value}`);
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
challengeRemoveFn: async (authz, challenge) => {
|
|
176
|
+
if (challenge.type === "dns-01" && this.cloudflare) {
|
|
177
|
+
await this.removeDnsChallenge(authz.identifier.value);
|
|
178
|
+
}
|
|
179
|
+
else if (challenge.type === "http-01") {
|
|
180
|
+
this.pendingChallenges.delete(challenge.token);
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
challengePriority: usesDns01 ? ["dns-01"] : ["http-01"],
|
|
184
|
+
});
|
|
185
|
+
// Parse certificate to get expiry
|
|
186
|
+
const certInfo = await acme.crypto.readCertificateInfo(cert);
|
|
187
|
+
const expiresAt = certInfo.notAfter;
|
|
188
|
+
// Save certificate and key
|
|
189
|
+
const certPath = path.join(this.certsDir, `${primaryDomain}.crt`);
|
|
190
|
+
const keyPath = path.join(this.certsDir, `${primaryDomain}.key`);
|
|
191
|
+
const metaPath = path.join(this.certsDir, `${primaryDomain}.json`);
|
|
192
|
+
fs.writeFileSync(certPath, cert);
|
|
193
|
+
fs.writeFileSync(keyPath, key.toString());
|
|
194
|
+
fs.writeFileSync(metaPath, JSON.stringify({
|
|
195
|
+
domains,
|
|
196
|
+
expiresAt: expiresAt.toISOString(),
|
|
197
|
+
issuedAt: new Date().toISOString(),
|
|
198
|
+
}, null, 2));
|
|
199
|
+
this.logger.info(`Certificate saved, expires: ${expiresAt.toISOString()}`);
|
|
200
|
+
return {
|
|
201
|
+
cert,
|
|
202
|
+
key: key.toString(),
|
|
203
|
+
expiresAt,
|
|
204
|
+
domains,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
async createDnsChallenge(domain, keyAuthorization) {
|
|
208
|
+
if (!this.cloudflare || !this.cloudflareZoneId) {
|
|
209
|
+
throw new Error("Cloudflare not configured");
|
|
210
|
+
}
|
|
211
|
+
// Create DNS TXT record for ACME challenge
|
|
212
|
+
const recordName = `_acme-challenge.${domain.replace("*.", "")}`;
|
|
213
|
+
const digestValue = crypto
|
|
214
|
+
.createHash("sha256")
|
|
215
|
+
.update(keyAuthorization)
|
|
216
|
+
.digest("base64url");
|
|
217
|
+
this.logger.info(`Creating DNS-01 challenge: ${recordName}`);
|
|
218
|
+
try {
|
|
219
|
+
const record = await this.cloudflare.dns.records.create({
|
|
220
|
+
zone_id: this.cloudflareZoneId,
|
|
221
|
+
type: "TXT",
|
|
222
|
+
name: recordName,
|
|
223
|
+
content: digestValue,
|
|
224
|
+
ttl: 120,
|
|
225
|
+
});
|
|
226
|
+
this.pendingDnsChallenges.set(domain, {
|
|
227
|
+
recordId: record.id,
|
|
228
|
+
zoneId: this.cloudflareZoneId,
|
|
229
|
+
});
|
|
230
|
+
// Wait for DNS propagation
|
|
231
|
+
this.logger.info("Waiting for DNS propagation (30s)...");
|
|
232
|
+
await new Promise(resolve => setTimeout(resolve, 30000));
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
this.logger.error(`DNS challenge creation failed: ${err.message}`);
|
|
236
|
+
throw err;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
async removeDnsChallenge(domain) {
|
|
240
|
+
const challenge = this.pendingDnsChallenges.get(domain);
|
|
241
|
+
if (!challenge || !this.cloudflare)
|
|
242
|
+
return;
|
|
243
|
+
try {
|
|
244
|
+
await this.cloudflare.dns.records.delete(challenge.recordId, {
|
|
245
|
+
zone_id: challenge.zoneId,
|
|
246
|
+
});
|
|
247
|
+
this.pendingDnsChallenges.delete(domain);
|
|
248
|
+
this.logger.info(`Removed DNS challenge for ${domain}`);
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
this.logger.error(`DNS challenge removal failed: ${err.message}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Handle HTTP-01 challenge requests
|
|
255
|
+
handleChallengeRequest(token) {
|
|
256
|
+
const challenge = this.pendingChallenges.get(token);
|
|
257
|
+
if (challenge) {
|
|
258
|
+
return challenge.keyAuthorization;
|
|
259
|
+
}
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
// Create HTTP server for ACME challenges (port 80)
|
|
263
|
+
createChallengeServer() {
|
|
264
|
+
const server = http.createServer((req, res) => {
|
|
265
|
+
const url = req.url || "";
|
|
266
|
+
// Handle ACME HTTP-01 challenge
|
|
267
|
+
if (url.startsWith("/.well-known/acme-challenge/")) {
|
|
268
|
+
const token = url.split("/").pop() || "";
|
|
269
|
+
const keyAuth = this.handleChallengeRequest(token);
|
|
270
|
+
if (keyAuth) {
|
|
271
|
+
this.logger.info(`Serving ACME challenge for token: ${token.substring(0, 10)}...`);
|
|
272
|
+
res.writeHead(200, { "Content-Type": "text/plain" });
|
|
273
|
+
res.end(keyAuth);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Redirect all other HTTP to HTTPS
|
|
278
|
+
const host = req.headers.host || "";
|
|
279
|
+
res.writeHead(301, { Location: `https://${host}${url}` });
|
|
280
|
+
res.end();
|
|
281
|
+
});
|
|
282
|
+
return server;
|
|
283
|
+
}
|
|
284
|
+
// Check if certificate exists
|
|
285
|
+
hasCertificate(domain) {
|
|
286
|
+
const safeDomain = domain.replace("*.", "wildcard.");
|
|
287
|
+
const certPath = path.join(this.certsDir, `${safeDomain}.crt`);
|
|
288
|
+
const keyPath = path.join(this.certsDir, `${safeDomain}.key`);
|
|
289
|
+
return fs.existsSync(certPath) && fs.existsSync(keyPath);
|
|
290
|
+
}
|
|
291
|
+
// Load certificate from disk
|
|
292
|
+
loadCertificate(domain) {
|
|
293
|
+
const safeDomain = domain.replace("*.", "wildcard.");
|
|
294
|
+
const certPath = path.join(this.certsDir, `${safeDomain}.crt`);
|
|
295
|
+
const keyPath = path.join(this.certsDir, `${safeDomain}.key`);
|
|
296
|
+
if (fs.existsSync(certPath) && fs.existsSync(keyPath)) {
|
|
297
|
+
return {
|
|
298
|
+
cert: fs.readFileSync(certPath, "utf-8"),
|
|
299
|
+
key: fs.readFileSync(keyPath, "utf-8"),
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
return null;
|
|
303
|
+
}
|
|
304
|
+
hasCloudflare() {
|
|
305
|
+
return this.cloudflare !== null;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Generate a self-signed certificate for local/development use.
|
|
309
|
+
* No external dependencies required.
|
|
310
|
+
*/
|
|
311
|
+
generateSelfSignedCertificate(domain, options) {
|
|
312
|
+
const validDays = options?.validDays || 365;
|
|
313
|
+
const org = options?.organization || "OpenTunnel";
|
|
314
|
+
const safeDomain = domain.replace("*.", "wildcard.");
|
|
315
|
+
const certPath = path.join(this.certsDir, `${safeDomain}.crt`);
|
|
316
|
+
const keyPath = path.join(this.certsDir, `${safeDomain}.key`);
|
|
317
|
+
const metaPath = path.join(this.certsDir, `${safeDomain}.json`);
|
|
318
|
+
// Check if we already have a valid self-signed cert
|
|
319
|
+
if (fs.existsSync(certPath) && fs.existsSync(keyPath) && fs.existsSync(metaPath)) {
|
|
320
|
+
try {
|
|
321
|
+
const meta = JSON.parse(fs.readFileSync(metaPath, "utf-8"));
|
|
322
|
+
const expiresAt = new Date(meta.expiresAt);
|
|
323
|
+
// If still valid (with 7 day buffer), use it
|
|
324
|
+
const sevenDaysMs = 7 * 24 * 60 * 60 * 1000;
|
|
325
|
+
if (expiresAt.getTime() - Date.now() > sevenDaysMs) {
|
|
326
|
+
this.logger.info(`Using existing self-signed certificate for ${domain}`);
|
|
327
|
+
return {
|
|
328
|
+
cert: fs.readFileSync(certPath, "utf-8"),
|
|
329
|
+
key: fs.readFileSync(keyPath, "utf-8"),
|
|
330
|
+
expiresAt,
|
|
331
|
+
domains: meta.domains,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
// Regenerate if meta is corrupted
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
this.logger.info(`Generating self-signed certificate for ${domain}...`);
|
|
340
|
+
// Generate key pair using node-forge
|
|
341
|
+
const keys = forge.pki.rsa.generateKeyPair(2048);
|
|
342
|
+
// Create certificate
|
|
343
|
+
const cert = forge.pki.createCertificate();
|
|
344
|
+
cert.publicKey = keys.publicKey;
|
|
345
|
+
cert.serialNumber = Date.now().toString(16);
|
|
346
|
+
// Set validity
|
|
347
|
+
const now = new Date();
|
|
348
|
+
const expiresAt = new Date(now.getTime() + validDays * 24 * 60 * 60 * 1000);
|
|
349
|
+
cert.validity.notBefore = now;
|
|
350
|
+
cert.validity.notAfter = expiresAt;
|
|
351
|
+
// Set subject and issuer (self-signed, so they're the same)
|
|
352
|
+
const attrs = [
|
|
353
|
+
{ name: "commonName", value: domain },
|
|
354
|
+
{ name: "organizationName", value: org },
|
|
355
|
+
];
|
|
356
|
+
cert.setSubject(attrs);
|
|
357
|
+
cert.setIssuer(attrs);
|
|
358
|
+
// Set extensions for proper SSL/TLS usage
|
|
359
|
+
cert.setExtensions([
|
|
360
|
+
{
|
|
361
|
+
name: "basicConstraints",
|
|
362
|
+
cA: false,
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
name: "keyUsage",
|
|
366
|
+
critical: true,
|
|
367
|
+
digitalSignature: true,
|
|
368
|
+
keyEncipherment: true,
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
name: "extKeyUsage",
|
|
372
|
+
serverAuth: true,
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
name: "subjectAltName",
|
|
376
|
+
altNames: [
|
|
377
|
+
{ type: 2, value: domain }, // DNS
|
|
378
|
+
{ type: 2, value: `*.${domain.replace("*.", "")}` }, // Wildcard DNS
|
|
379
|
+
],
|
|
380
|
+
},
|
|
381
|
+
]);
|
|
382
|
+
// Sign the certificate with SHA-256
|
|
383
|
+
cert.sign(keys.privateKey, forge.md.sha256.create());
|
|
384
|
+
// Convert to PEM format
|
|
385
|
+
const certPem = forge.pki.certificateToPem(cert);
|
|
386
|
+
const keyPem = forge.pki.privateKeyToPem(keys.privateKey);
|
|
387
|
+
// Save to files
|
|
388
|
+
fs.writeFileSync(certPath, certPem);
|
|
389
|
+
fs.writeFileSync(keyPath, keyPem);
|
|
390
|
+
// Save metadata
|
|
391
|
+
fs.writeFileSync(metaPath, JSON.stringify({
|
|
392
|
+
domains: [domain, `*.${domain.replace("*.", "")}`],
|
|
393
|
+
expiresAt: expiresAt.toISOString(),
|
|
394
|
+
issuedAt: now.toISOString(),
|
|
395
|
+
selfSigned: true,
|
|
396
|
+
}, null, 2));
|
|
397
|
+
this.logger.info(`Self-signed certificate generated, expires: ${expiresAt.toISOString()}`);
|
|
398
|
+
return {
|
|
399
|
+
cert: certPem,
|
|
400
|
+
key: keyPem,
|
|
401
|
+
expiresAt,
|
|
402
|
+
domains: [domain],
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Get or generate a self-signed certificate for the given domain.
|
|
407
|
+
* This is the main entry point for automatic local HTTPS.
|
|
408
|
+
*/
|
|
409
|
+
getOrCreateSelfSignedCert(domain) {
|
|
410
|
+
return this.generateSelfSignedCertificate(domain);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
exports.CertManager = CertManager;
|
|
414
|
+
//# sourceMappingURL=CertManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CertManager.js","sourceRoot":"","sources":["../../src/server/CertManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
import { ServerConfig } from "../shared/types";
|
|
3
|
+
export declare class TunnelServer extends EventEmitter {
|
|
4
|
+
private config;
|
|
5
|
+
private httpServer;
|
|
6
|
+
private httpRedirectServer;
|
|
7
|
+
private wss;
|
|
8
|
+
private clients;
|
|
9
|
+
private tunnelsBySubdomain;
|
|
10
|
+
private tunnelsByPort;
|
|
11
|
+
private usedPorts;
|
|
12
|
+
private pendingRequests;
|
|
13
|
+
private logger;
|
|
14
|
+
private keepaliveInterval;
|
|
15
|
+
private certManager;
|
|
16
|
+
private isHttps;
|
|
17
|
+
private dnsProvider;
|
|
18
|
+
constructor(config: Partial<ServerConfig>);
|
|
19
|
+
private setupHttps;
|
|
20
|
+
start(): Promise<void>;
|
|
21
|
+
private setupAutoDns;
|
|
22
|
+
private detectDnsProvider;
|
|
23
|
+
stop(): Promise<void>;
|
|
24
|
+
private startKeepalive;
|
|
25
|
+
private stopKeepalive;
|
|
26
|
+
private handleConnection;
|
|
27
|
+
private handleMessage;
|
|
28
|
+
private handleAuth;
|
|
29
|
+
private handleTunnelRequest;
|
|
30
|
+
private handleTunnelClose;
|
|
31
|
+
private closeTunnel;
|
|
32
|
+
private handleHttpRequest;
|
|
33
|
+
private waitForResponse;
|
|
34
|
+
private handleHttpResponse;
|
|
35
|
+
private handleTcpConnection;
|
|
36
|
+
private handleTcpData;
|
|
37
|
+
private handleApiRequest;
|
|
38
|
+
private send;
|
|
39
|
+
private getTunnelCount;
|
|
40
|
+
private getAllTunnels;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=TunnelServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TunnelServer.d.ts","sourceRoot":"","sources":["../../src/server/TunnelServer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EACH,YAAY,EAUf,MAAM,iBAAiB,CAAC;AA+CzB,qBAAa,YAAa,SAAQ,YAAY;IAC1C,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,GAAG,CAAkB;IAC7B,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,kBAAkB,CAAkC;IAC5D,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,WAAW,CAAwC;gBAE/C,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC;YAmC3B,UAAU;IAsIlB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAuCd,YAAY;IA0D1B,OAAO,CAAC,iBAAiB;IAuBzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BrB,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,gBAAgB;IA2DxB,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,mBAAmB;IAuK3B,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,WAAW;YAuCL,iBAAiB;IAqF/B,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,mBAAmB;IAmC3B,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,aAAa;CAkBxB"}
|