尝试为使用 TLS 1.2 协议(protocol)并连接到多个 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*/ };
我执行了以下步骤来实现结果:
- 根据此 manual 创建 CA 根 key 和自签名证书。它有点过时了,所以我做了一些更改,例如将 md5 更改为 sha256,而且我没有使用密码短语,使用了不同的 key 大小和其他细微更改。
- 使用上述根 CA 创建代理 key 和证书进行签名。
- 这两个证书均已添加到个人和受信任的根证书颁发机构中的本地计算机证书中(不确定这是否有必要)。顺便说一句,我使用的是 Windows 10。
- 使用 here 中的示例代码编写了一个简单的代理服务器。 Cert.pem 和 Key.pem 取自第二步。
- 将应用中的所有 IP 地址更改为 127.0.0.1:443,以查看 TLS 连接是否成功建立,以及我们是否可以收到带有应用数据的第一条消息。
我相信连接已正确建立,因为 WireShark 显示了建立 TLS 连接的常见顺序:客户端/服务器问候、证书、客户端 key 交换、两个加密的握手消息。此外,使用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?绝对地!这会很容易吗?可能不会。您需要做的是修补应用程序并删除此证书检查。
关于c++ - MITM 代理,TLS 1.2 证书验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62975238/