mirror of
https://github.com/imputnet/cobalt.git
synced 2025-07-18 19:28:29 +00:00
api: randomize cipherlist for making requests to services
this makes cobalt less prone to TLS client fingerprinting, as it avoids having the default node.js TLS fingerprint that is shared by all node.js applications.
This commit is contained in:
parent
1d5fa62271
commit
fea4f71768
@ -10,6 +10,7 @@ import loc from "../localization/manager.js";
|
||||
|
||||
import { createResponse, normalizeRequest, getIP } from "../modules/processing/request.js";
|
||||
import { verifyStream, getInternalStream } from "../modules/stream/manage.js";
|
||||
import { randomizeCiphers } from '../modules/sub/randomize-ciphers.js';
|
||||
import { extract } from "../modules/processing/url.js";
|
||||
import match from "../modules/processing/match.js";
|
||||
import stream from "../modules/stream/stream.js";
|
||||
@ -215,6 +216,9 @@ export function runAPI(express, app, gitCommit, gitBranch, __dirname) {
|
||||
res.redirect('/api/serverInfo')
|
||||
})
|
||||
|
||||
randomizeCiphers();
|
||||
setInterval(randomizeCiphers, 1000 * 60 * 30); // shuffle ciphers every 30 minutes
|
||||
|
||||
app.listen(env.apiPort, env.listenAddress, () => {
|
||||
console.log(`\n` +
|
||||
`${Cyan("cobalt")} API ${Bright(`v.${version}-${gitCommit} (${gitBranch})`)}\n` +
|
||||
|
28
src/modules/sub/randomize-ciphers.js
Normal file
28
src/modules/sub/randomize-ciphers.js
Normal file
@ -0,0 +1,28 @@
|
||||
import tls from 'node:tls';
|
||||
import { randomBytes } from 'node:crypto';
|
||||
|
||||
const ORIGINAL_CIPHERS = tls.DEFAULT_CIPHERS;
|
||||
|
||||
// How many ciphers from the top of the list to shuffle.
|
||||
// The remaining ciphers are left in the original order.
|
||||
const TOP_N_SHUFFLE = 8;
|
||||
|
||||
// Modified variation of https://stackoverflow.com/a/12646864
|
||||
const shuffleArray = (array) => {
|
||||
for (let i = array.length - 1; i > 0; i--) {
|
||||
const j = randomBytes(4).readUint32LE() % array.length;
|
||||
[array[i], array[j]] = [array[j], array[i]];
|
||||
}
|
||||
|
||||
return array;
|
||||
}
|
||||
|
||||
export const randomizeCiphers = () => {
|
||||
do {
|
||||
const cipherList = ORIGINAL_CIPHERS.split(':');
|
||||
const shuffled = shuffleArray(cipherList.slice(0, TOP_N_SHUFFLE));
|
||||
const retained = cipherList.slice(TOP_N_SHUFFLE);
|
||||
|
||||
tls.DEFAULT_CIPHERS = [ ...shuffled, ...retained ].join(':');
|
||||
} while (tls.DEFAULT_CIPHERS === ORIGINAL_CIPHERS);
|
||||
}
|
Loading…
Reference in New Issue
Block a user