Связь между клиентом и прокси продолжает сбой из-за самозаверяющего сертификата - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть прокси-приложение, написанное на 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

Кто-нибудь знает, что я делаю неправильно и как я могу сделать эту работу?

Спасибо!

1 Ответ

1 голос
/ 02 марта 2020

Попробуйте установить небезопасное соединение TLS от прокси-сервера к приложению - добавьте этот фрагмент к своему прокси-коду:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

Или попробуйте добавить свой собственный сертификат CA в свою систему (где работает прокси-приложение) ) CA сертификаты. Точная команда зависит от используемой ОС.

...