c++ - MITM 代理,TLS 1.2 证书验证失败
问题描述
尝试为使用 TLS 1.2 协议并连接到多个 IP 地址的特定应用程序创建我自己的简单 MITM 代理,但在应用程序日志“证书验证失败”中遇到错误。如何解决这个问题呢?
该应用程序使用以下代码检查证书:
X509* cert = SSL_get_peer_certificate( ssl );
X509_STORE_CTX * xCtx = X509_STORE_CTX_new();
X509_STORE_CTX_init( xCtx, (X509_STORE*)Store, cert, NULL );
int res = X509_verify_cert( xCtx );
if( !res ) { /*Certificate verify failed*/ };
我做了以下步骤来实现结果:
- 根据本手册创建 CA 根密钥和自签名证书。它有点过时了,所以我做了一些改变,比如 md5 到 sha256,我也没有使用密码短语,使用了不同的密钥大小和其他小的改变。
- 使用上述根 CA 创建代理密钥和证书以对其进行签名。
- 这两个证书都已添加到个人和受信任的根证书颁发机构的本地计算机证书中(不确定是否有必要)。顺便说一句,我使用的是 Windows 10。
- 使用此处的示例代码编写了一个简单的代理服务器。Cert.pem 和 Key.pem 取自第二步。
- 将应用程序中的所有 IP 地址更改为 127.0.0.1:443 以查看 TLS 连接是否建立成功,并且我们可以收到带有应用程序数据的第一条消息。
我相信连接建立正确,因为 WireShark 显示了建立 TLS 连接的常见顺序:客户端/服务器问候、证书、客户端密钥交换、两个加密的握手消息。此外,使用 OpenSSL 测试连接:
openssl s_client -connect localhost:443
允许我写一些消息,然后在代理服务器中使用 SSL_Read() 成功接收它。但是,有一些错误:
verify error:num=20:unable to get local issuer certificate
verify return:1
verify error:num=21:unable to verify the first certificate
verify return:1
Verify return code: 21 (unable to verify the first certificate)
使用 OpenSSL 客户端直接连接到原始 IP 地址会产生相同的错误,但应用程序运行良好。
还有输出:
openssl verify -CAfile "signing-ca-1.crt" "cert.crt"
WARNING: can't open config file: /usr/local/ssl/openssl.cnf
e:\MyProg\SSL_serv\Debug\cert.crt: OK
似乎我错过了一些重要的事情。你能告诉我如何用证书解决这个问题吗?
解决方案
拥有证书以及证书颁发机构的目的之一就是防止 MITM。您正在尝试的应用程序会做正确的事情并检查证书。而且它不喜欢你的。真的就这么简单。
是否有可能绕过它并在应用程序上运行 MITM?绝对地!会很容易吗?可能不是。您需要做的是修补应用程序并删除此证书检查。
推荐阅读
- javascript - 使用 fetch js 和 php 发送简单的邮件
- xcode - 平移 AudioKit 的 AKMetronome
- java - Android Studio 蓝牙应用程序错误::app:mergeDebugResources
- linux - bash stdout 输出出现在重定向的 stderr 文件中
- json - 将字符串(类似 XML)格式化为 JSON
- java - 在 Rest API 调用中防止布尔值来自对象中的垃圾值
- xpath - 使用 Xpath 获取两个列表,它们都包含在同一个容器中
- asp.net - ASP.NET Core 身份声明继承不起作用
- c# - Xamarin 表单 - 识别位置
- object - 如何访问对象 stdClass 对象的属性?