我正在开发一个HTTP代理。开发此功能的主要目的是记录HTTP / HTTPS流量。
HTTP案例
这相对容易。当我收到包裹时,我会积累。一旦我获得完整的数据包,我就会将此数据包发送到实际的Web服务器。
当实际的Web服务器响应时,我将其发送到浏览器。
这样我就能正确记录HTTP流量(请求,响应)。
HTTPS案例
这个看起来有点复杂。我有很少的传输连接来管理它。
第一个浏览器向我的HTTP代理发送CONNECT请求,并设置了到实际Web服务器的隧道。
在Tx路径中,浏览器将SSL加密数据发送到HTTP代理,累积它,获取完整消息,HTTP代理将其发送到实际的Web服务器,并将消息记录到文件中。
同样在Rx路径中,当实际Web服务器发送SSL加密响应时,HTTP代理会将响应发送到浏览器并将响应记录到文件中。
要管理上面我有以下传输连接
Browser(tcp) - HTTP代理(tcp)连接
HTTP代理(tcp) - HTTP代理(tls)连接
HTTP代理(tls) - 实际Web服务器(tls)连接
在某种程度上,我已经成功但现在并不完美。我有以下问题阻止我完善它。
我使用gnutls certools命令动态创建证书。
由于我创建了自签名证书,浏览器(比如firefox)抱怨,在添加异常时会通过。
对于某些链接,我没有异常,相应的数据我没有
在浏览器中看到。例如,当我访问https://www.dawn.com时,查看图像位于https://i.dawn.com服务器中。我从未对i.dawn.com有任何例外,但firefox从未显示图像。由于安全问题,firefox调试日志显示i.dawn.com中的内容无法显示。
有人可以帮助我学习,如何设计这些中间代理并解决证书问题。
证书生成
我遵循以下程序生成证书。如果我做错了,请告诉我。
我使用gnutls certtool命令生成证书
certtool --generate-privkey --outfile key.pem
certtool --generate-self-signed --load-privkey key.pem --template cert.cfg --outfile cert.pem
接下来,我将/etc/ssl/certs/ca-certificates.crt复制到当前路径。 接下来,我将cert.pem内容附加到ca-certificates.crt文件。
最后,我使用key.pem,cert.pem和ca-certificates.crt文件进行TLS连接。
我在一些帮助页面上执行了此过程。我不确定我这样做是否正确。
如果我在这里做错了,请告诉我。
生成证书的程序
我们需要表现为CA,首先我们需要生成证书,并且应该在要信任的系统中明确设置此证书。
certtool --generate-privkey --outfile ca-key.pem
certtool --generate-self-signed --load-privkey ca-key.pem --outfile ca-cert.pem
现在应该在系统中明确设置此ca-cert.pem以进行信任。因此,应用程序共享系统证书存储可以信任使用此CA证书签名的证书。
我正在关注https://askubuntu.com/questions/73287/how-do-i-install-a-root-certificate以明确将ca-cert.pem设置为信任。
在接受的答案中,第二条评论说我们需要将pem文件转换为crt文件。在引用整个页面时,我的理解是我们需要以PEM格式提供crt文件。我们如何使用certtool做任何想法......
接下来,使用 sudo dpkg-reconfigure ca-certificates 命令,我将系统中的证书设置为trus。
接下来,我将使用下面的命令生成私钥和证书文件
certtool --generate-privkey --outfile key.pem
certtool --generate-request --load-privkey key.pem --outfile request.pem
certtool --generate-certificate --load-request request.pem --outfile cert.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem
然后使用模板文件cert.cfg
再添加一个命令certtool --generate-certificate cert.pem --load-privkey key.pem --template cert.cfg --load-ca-certificate ca-cert.pem --load-ca-privkey ca- key.pem
这个命令真的需要吗?出于何种目的使用它。
请澄清。