探索MITM-> SSL / TLS,证书和代理功能

时间:2018-09-08 07:49:45

标签: ios node.js ssl ssl-certificate charles-proxy

我有一个iOS应用程序,可通过https与API进行通信。通过在手机上安装Charles代理的根证书并将我的计算机设置为代理,我已经成功地在Charles代理中以明文形式截获了这些消息。

我现在正在全神贯注于所有工作原理,因此我试图在NodeJS中重现Charles代理的功能。

我已采取的步骤:

  1. 生成根CA并在iOS中安装
  2. 生成与API服务器证书匹配的服务器证书,并从步骤1开始用CA签名
  3. 使用服务器证书设置NodeJS服务器

现在,如果我将计算机设置为IOS中的代理,请进入iOS应用程序,那么我是否应该将请求发送到NodeJS服务器?真的什么也没发生。 NodeJS服务器未收到任何请求,iOS应用程序无法显示信息(因为它当然无法到达API)。

在我的脑海中,应该发生以下流动:

  • iOS应用程序通过请求服务器证书与NodeJS应用程序建立连接
  • NodeJS虚假返回服务器证书,称它是iOS应用正在尝试与之通信的实际API
  • iOS应用检查其CA存储并从第1步中找到CA,然后虚假验证服务器是否正确
  • iOS应用现在应该能够与NodeJS服务器通信,并且NodeJS服务器应该能够截获明文消息

我的问题是:我想念什么?为什么它不起作用?

我在下面包含了一些代码。请注意,我还没有开始代理“真实” API,我只是想在NodeJS中接收消息。

以下是与上述步骤相关的代码:

  1. 生成根CA和服务器证书

    # CA
    openssl genrsa -out ca.key 4096
    openssl req -x509 -new -nodes -key ca.key -sha256 -days 1024 -out ca.crt
    
  2. 生成与API服务器证书匹配的服务器证书,并从步骤1开始用CA签名

    # Server
    openssl genrsa -out server.key 2048
    openssl req -new -sha256 -key server.key -subj "/C=US/ST=CA/O=MyOrg Inc./CN=external.api.com" -out server.csr
    openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 500 -sha256
    
  3. NodeJS服务器

    const fs = require('fs');
    const https = require('https');
    
    const options = {
      key: fs.readFileSync('./server.key'),
      cert: fs.readFileSync('./server.crt'),
    };
    
    https.createServer(options, (req, res) => {
      console.log(`Got request headers: ${JSON.stringify(req.headers, true, 2)}`);
      console.log(`Got request body: ${JSON.stringify(req.body, true, 2)}`);
      console.log(`Got request url: ${req.url}`);
    
      res.writeHead(200, { 'Content-type': 'text/plain' });
      res.write('yup');
      res.end();
    }).listen(3102);
    

0 个答案:

没有答案