У меня есть прокси-приложение, написанное на Javascript / Node.js, которое использует библиотеку http-mitm-proxy .
У меня также есть сервер https на отдельной машине, которая будет обслуживать файлы (в настоящее время он просто отвечает "привет мир"). Для этого я использовал самоподписанный root CA и самоподписанный сертификат (подробности ниже).
На третьем компьютере я пытаюсь получить доступ к файловому серверу https через прокси-сервер. Я просто использую Firefox для этого (я настроил параметры прокси с IP-адресом моего прокси-машины).
Я пытаюсь перехватить https traffi c (то есть файлы) на прокси и кэшируйте его (т.е. расшифруйте, сохраните локально, а затем передайте). По сути, это атака «человек посередине».
Проблема в том, что прокси и клиент продолжают отклонять самозаверяющий сертификат во время связи.
Я создал rootCA и самостоятельно подписанный сертификат с использованием шагов здесь . При необходимости я могу предоставить точные значения / детали.
Я импортировал сертификат в Firefox на своем клиентском компьютере и использую их в коде прокси-приложения. Я также добавил соответствующие записи в файл hosts на клиенте и прокси-компьютере.
Вот мой код:
// Файловый сервер HTTPS:
const https = require('https');
const fs = require('fs');
const options = {
key: fs.readFileSync('myupdateproxy.com.key'),
cert: fs.readFileSync('myupdateproxy.com.crt')
};
https.createServer(options, function (req, res) {
res.writeHead(200);
res.end("hello world\n");
}).listen(8000);
/ / код прокси-сервера:
'use strict';
var port = 8081;
var path = require('path');
var Proxy = require('http-mitm-proxy');
var proxy = Proxy();
const fs = require('fs');
var chunks1 = [];
var chunks2 = [];
proxy.onCertificateRequired = function(hostname, callback) {
return callback(null, {
keyFile: path.resolve('myupdateproxy.com.key'),
certFile: path.resolve('myupdateproxy.com.crt')
});
};
proxy.onError(function(ctx, err, errorKind) {
// ctx may be null
var url = (ctx && ctx.clientToProxyRequest) ? ctx.clientToProxyRequest.url : '';
console.error(errorKind + ' on ' + url + ':', err);
});
proxy.onRequest(function(ctx, callback) {
console.log('onRequest');
callback();
});
proxy.onRequestData(function(ctx, chunk, callback) {
console.log('onRequestData');
chunks1.push(chunk);
callback(null, chunk);
});
proxy.onRequestEnd(function(ctx, callback) {
if (ctx.clientToProxyRequest.socket.remoteAddress !== undefined &&
ctx.proxyToServerRequest.socket.remoteAddress !== undefined &&
(Buffer.concat(chunks1)).length > 0)
{
console.log('From: ' + ctx.clientToProxyRequest.socket.remoteAddress);
console.log('To: ' + ctx.proxyToServerRequest.socket.remoteAddress);
console.log('Size: ' + (Buffer.concat(chunks1)).length);
console.log('');
}
chunks1 = [];
callback();
});
proxy.onResponse(function(ctx, callback) {
callback(null);
});
proxy.onResponseData(function(ctx, chunk, callback) {
chunks2.push(chunk);
callback(null, chunk);
});
proxy.onResponseEnd(function(ctx, callback) {
var total_size=(Buffer.concat(chunks2)).length;
if (ctx.serverToProxyResponse.socket.remoteAddress !== undefined &&
ctx.proxyToClientResponse.socket.remoteAddress !== undefined &&
total_size > 0)
{
console.log('From: ' + ctx.serverToProxyResponse.socket.remoteAddress);
console.log('To: ' + ctx.proxyToClientResponse.socket.remoteAddress);
console.log('Size: ' + total_size);
console.log('');
}
console.log((Buffer.concat(chunks2)).toString());
chunks2 = [];
callback();
});
proxy.listen({ port: port, sslCaDir: "/home/user/mycerts/" });
console.log('listening on ' + port);
Я продолжаю получать эту ошибку в прокси-приложении:
onRequest
PROXY_TO_SERVER_REQUEST_ERROR on /: Error: self signed certificate
at TLSSocket.onConnectSecure (_tls_wrap.js:1473:34)
at TLSSocket.emit (events.js:311:20)
at TLSSocket._finishInit (_tls_wrap.js:916:8)
at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:686:12) {
code: 'DEPTH_ZERO_SELF_SIGNED_CERT'
}
И это сообщение на клиентском компьютере (в Firefox):
PROXY_TO_SERVER_REQUEST_ERROR: Error: self signed certificate
Кто-нибудь знает, что я делаю неправильно и как я могу сделать эту работу?
Спасибо!