PMS mitm proxy
npm install pms-proxybash
npm install pms-proxy
`
Todo
- Write unit test
- Setup CI
-
Progress
- Support http2
-
Document
$3
- Javascript
`javascript
const {PPServerProxy} = require('pms-proxy');
`
- Typescript
`javascript
import PPServerProxy from "pms-proxy";
`
$3
`javascript
const server = new PPServerProxy()
server.listen(1234).then(() => {
console('created!');
})
`
$3
`javascript
const forwardDst = 'wss://socketsbay.com/wss/v2/2/demo/';
server.getWebsocket()
.addRule()
.host('abc.com')
.then(new PPPassThroughWsHandler(forwardDst))
server.getWebsocket()
.addRule()
.url(/wss:\/\/hello\.com/)
.then(new PPPassThroughWsHandler(forwardDst))
`
$3
Note: https only capture when provide CA cert, and install CA cert in machine
`javascript
server.addRule()
.any()
.then(async (request, response) => {
console.log(request.method, request.url);
const passThrough = new PPPassThroughHttpHandler();
passThrough.injectBuffer((request, buffer) => {
console.log('--> response buffer size', buffer.length);
return { data: buffer };
})
await passThrough.handle(request, response);
})
`
$3
`javascript
const pass = new PPPassThroughHttpHandler();
pass.injectBuffer((req, buffer) => {
return {
data: buffer.toString() + ""
};
})
server.addRule()
.host(/abc\.com/g)
// or .host("abc.com")
// or .host((host) => host === "abc.com")
.then(pass);
`
$3
`javascript
server.addRule()
.any()
.then((req, res) => {
res.status(200).write('Hello world!');
})
`
$3
`javascript
/// app as express
const app = createAppHttpHandler();
app.get('/', (req, res) => {
res.status(200).send('oke');
})
server.addRule().host('test-fake.com').then(app);
`
$3
`javascript
const ws = server.getWebsocket();
ws.addRule()
.host('abc.com')
.then((req, ws) => {
ws.send('oke ws');
})
`
$3
`javascript
const inject = new PPPassThroughWsHandler();
inject.injectSend(data => data.toString() + ' inject!');
inject.injectReceive(data => data.toString() + ' inject!');
const ws = server.getWebsocket();
ws.addRule().host('abc.com').then(inject)
`
$3
`javascript
const server = new PPServerProxy({
https: {
certPath: path.join(__dirname, '../certs/rootCA.pem'),
keyPath: path.join(__dirname, '../certs/rootCA.key')
}
});
`
- create CA cert:
`shell
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1825 -out rootCA.pem
openssl pkcs12 -export -out rootCA.p12 -inkey rootCA.key -in rootCA.pem
`
- create monitor https & SPKI
`typescript
const https = await PPCa.generateCACertificate();
const spki = PPCa.generateSPKIFingerprint((https).cert);
const userData = path.join('C:/test-chrome');
const server = new PPServerProxy({https});
await server.listen(1234);
// node module
child_process.exec(
start chrome --proxy-server="http://127.0.0.1:1234" --ignore-certificate-errors-spki-list=\"${spki}\" --user-data-dir=\"${userData}\"
);
``