@bman654/clodex 2.18.8 → 2.18.9
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/cli.js +58 -23
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -346,7 +346,7 @@ import { join } from "path";
|
|
|
346
346
|
// package.json
|
|
347
347
|
var package_default = {
|
|
348
348
|
name: "@bman654/clodex",
|
|
349
|
-
version: "2.18.
|
|
349
|
+
version: "2.18.9",
|
|
350
350
|
publishConfig: {
|
|
351
351
|
access: "public"
|
|
352
352
|
},
|
|
@@ -19906,7 +19906,7 @@ var CA_KEY_FILE = "clodex-ca-key.pem";
|
|
|
19906
19906
|
var SERVER_CERT_FILE = "api.anthropic.com.pem";
|
|
19907
19907
|
var SERVER_KEY_FILE = "api.anthropic.com-key.pem";
|
|
19908
19908
|
var CERT_VERSION_FILE = "version";
|
|
19909
|
-
var CERT_VERSION = "
|
|
19909
|
+
var CERT_VERSION = "2\n";
|
|
19910
19910
|
function serialNumber() {
|
|
19911
19911
|
const bytes = randomBytes2(16);
|
|
19912
19912
|
bytes[0] &= 127;
|
|
@@ -19931,6 +19931,31 @@ function writePublic(path, value) {
|
|
|
19931
19931
|
writeFileSync7(path, value, { encoding: "utf8", mode: 420 });
|
|
19932
19932
|
chmodSync5(path, 420);
|
|
19933
19933
|
}
|
|
19934
|
+
function generateServerCertificate(paths, caCert, caKey) {
|
|
19935
|
+
const caKeyId = caCert.getExtension("subjectKeyIdentifier")?.subjectKeyIdentifier;
|
|
19936
|
+
const serverKeys = forge.pki.rsa.generateKeyPair(2048);
|
|
19937
|
+
const serverCert = forge.pki.createCertificate();
|
|
19938
|
+
serverCert.publicKey = serverKeys.publicKey;
|
|
19939
|
+
serverCert.serialNumber = serialNumber();
|
|
19940
|
+
serverCert.validity.notBefore = new Date(Date.now() - 24 * 60 * 60 * 1e3);
|
|
19941
|
+
serverCert.validity.notAfter = new Date(Date.now() + 825 * 24 * 60 * 60 * 1e3);
|
|
19942
|
+
serverCert.setSubject([{ name: "commonName", value: "api.anthropic.com" }]);
|
|
19943
|
+
serverCert.setIssuer(caCert.subject.attributes);
|
|
19944
|
+
serverCert.setExtensions([
|
|
19945
|
+
{ name: "basicConstraints", cA: false, critical: true },
|
|
19946
|
+
{ name: "keyUsage", digitalSignature: true, keyEncipherment: true, critical: true },
|
|
19947
|
+
{ name: "extKeyUsage", serverAuth: true },
|
|
19948
|
+
{ name: "subjectAltName", altNames: [{ type: 2, value: "api.anthropic.com" }] },
|
|
19949
|
+
{ name: "subjectKeyIdentifier" },
|
|
19950
|
+
{
|
|
19951
|
+
name: "authorityKeyIdentifier",
|
|
19952
|
+
keyIdentifier: caKeyId ? forge.util.hexToBytes(caKeyId) : caCert.generateSubjectKeyIdentifier().getBytes()
|
|
19953
|
+
}
|
|
19954
|
+
]);
|
|
19955
|
+
serverCert.sign(caKey, forge.md.sha256.create());
|
|
19956
|
+
writePrivate(paths.serverKey, forge.pki.privateKeyToPem(serverKeys.privateKey));
|
|
19957
|
+
writePublic(paths.serverCert, forge.pki.certificateToPem(serverCert));
|
|
19958
|
+
}
|
|
19934
19959
|
function generateCertificates(paths) {
|
|
19935
19960
|
mkdirSync7(paths.dir, { recursive: true, mode: 448 });
|
|
19936
19961
|
chmodSync5(paths.dir, 448);
|
|
@@ -19949,35 +19974,37 @@ function generateCertificates(paths) {
|
|
|
19949
19974
|
{ name: "subjectKeyIdentifier" }
|
|
19950
19975
|
]);
|
|
19951
19976
|
caCert.sign(caKeys.privateKey, forge.md.sha256.create());
|
|
19952
|
-
const serverKeys = forge.pki.rsa.generateKeyPair(2048);
|
|
19953
|
-
const serverCert = forge.pki.createCertificate();
|
|
19954
|
-
serverCert.publicKey = serverKeys.publicKey;
|
|
19955
|
-
serverCert.serialNumber = serialNumber();
|
|
19956
|
-
serverCert.validity.notBefore = new Date(Date.now() - 24 * 60 * 60 * 1e3);
|
|
19957
|
-
serverCert.validity.notAfter = new Date(Date.now() + 825 * 24 * 60 * 60 * 1e3);
|
|
19958
|
-
serverCert.setSubject([{ name: "commonName", value: "api.anthropic.com" }]);
|
|
19959
|
-
serverCert.setIssuer(caCert.subject.attributes);
|
|
19960
|
-
serverCert.setExtensions([
|
|
19961
|
-
{ name: "basicConstraints", cA: false, critical: true },
|
|
19962
|
-
{ name: "keyUsage", digitalSignature: true, keyEncipherment: true, critical: true },
|
|
19963
|
-
{ name: "extKeyUsage", serverAuth: true },
|
|
19964
|
-
{ name: "subjectAltName", altNames: [{ type: 2, value: "api.anthropic.com" }] },
|
|
19965
|
-
{ name: "subjectKeyIdentifier" }
|
|
19966
|
-
]);
|
|
19967
|
-
serverCert.sign(caKeys.privateKey, forge.md.sha256.create());
|
|
19968
19977
|
writePrivate(paths.caKey, forge.pki.privateKeyToPem(caKeys.privateKey));
|
|
19969
19978
|
writePublic(paths.caCert, forge.pki.certificateToPem(caCert));
|
|
19970
|
-
|
|
19971
|
-
writePublic(paths.serverCert, forge.pki.certificateToPem(serverCert));
|
|
19979
|
+
generateServerCertificate(paths, caCert, caKeys.privateKey);
|
|
19972
19980
|
writePublic(paths.version, CERT_VERSION);
|
|
19973
19981
|
}
|
|
19982
|
+
var RENEWAL_BUFFER_MS = 7 * 24 * 60 * 60 * 1e3;
|
|
19983
|
+
function staysValid(cert, now) {
|
|
19984
|
+
return cert.validity.notBefore.getTime() <= now && cert.validity.notAfter.getTime() > now + RENEWAL_BUFFER_MS;
|
|
19985
|
+
}
|
|
19986
|
+
function keyMatchesCertificate(cert, key) {
|
|
19987
|
+
return cert.publicKey.n.compareTo(key.n) === 0;
|
|
19988
|
+
}
|
|
19989
|
+
function loadCurrentCa(paths) {
|
|
19990
|
+
try {
|
|
19991
|
+
const caCert = forge.pki.certificateFromPem(readFileSync12(paths.caCert, "utf8"));
|
|
19992
|
+
const caKey = forge.pki.privateKeyFromPem(readFileSync12(paths.caKey, "utf8"));
|
|
19993
|
+
if (!staysValid(caCert, Date.now())) return null;
|
|
19994
|
+
if (!caCert.verify(caCert)) return null;
|
|
19995
|
+
if (!keyMatchesCertificate(caCert, caKey)) return null;
|
|
19996
|
+
return { caCert, caKey };
|
|
19997
|
+
} catch {
|
|
19998
|
+
return null;
|
|
19999
|
+
}
|
|
20000
|
+
}
|
|
19974
20001
|
function storedCertificatesAreCurrent(paths) {
|
|
19975
20002
|
try {
|
|
19976
20003
|
const ca = forge.pki.certificateFromPem(readFileSync12(paths.caCert, "utf8"));
|
|
19977
20004
|
const server = forge.pki.certificateFromPem(readFileSync12(paths.serverCert, "utf8"));
|
|
20005
|
+
const serverKey = forge.pki.privateKeyFromPem(readFileSync12(paths.serverKey, "utf8"));
|
|
19978
20006
|
const now = Date.now();
|
|
19979
|
-
|
|
19980
|
-
return ca.validity.notBefore.getTime() <= now && ca.validity.notAfter.getTime() > now + renewalBuffer && server.validity.notBefore.getTime() <= now && server.validity.notAfter.getTime() > now + renewalBuffer && ca.verify(ca) && ca.verify(server);
|
|
20007
|
+
return staysValid(ca, now) && staysValid(server, now) && ca.verify(ca) && ca.verify(server) && keyMatchesCertificate(server, serverKey);
|
|
19981
20008
|
} catch {
|
|
19982
20009
|
return false;
|
|
19983
20010
|
}
|
|
@@ -19986,7 +20013,15 @@ function ensureHttpProxyCertificates() {
|
|
|
19986
20013
|
const paths = certPaths();
|
|
19987
20014
|
const required = [paths.caCert, paths.caKey, paths.serverCert, paths.serverKey, paths.version];
|
|
19988
20015
|
const current = required.every(existsSync6) && readFileSync12(paths.version, "utf8") === CERT_VERSION && storedCertificatesAreCurrent(paths);
|
|
19989
|
-
if (!current)
|
|
20016
|
+
if (!current) {
|
|
20017
|
+
const ca = loadCurrentCa(paths);
|
|
20018
|
+
if (ca) {
|
|
20019
|
+
generateServerCertificate(paths, ca.caCert, ca.caKey);
|
|
20020
|
+
writePublic(paths.version, CERT_VERSION);
|
|
20021
|
+
} else {
|
|
20022
|
+
generateCertificates(paths);
|
|
20023
|
+
}
|
|
20024
|
+
}
|
|
19990
20025
|
return {
|
|
19991
20026
|
caCertPath: paths.caCert,
|
|
19992
20027
|
caCert: readFileSync12(paths.caCert, "utf8"),
|