MITM代理,TLS 1.2证书验证失败

时间:2020-07-19 00:56:17

标签: c++ ssl openssl x509

尝试为使用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*/ };

我执行了以下步骤来获得结果:

  1. 根据此manual创建了CA根密钥和自签名证书。这有点过时了,所以我做了一些更改,例如将md5更改为sha256,也没有使用密码,使用了不同的密钥大小和其他较小的更改。
  2. 使用上述根CA创建的代理密钥和证书进行签名。
  3. 这两个证书都已添加到个人和受信任的根证书颁发机构中的本地计算机证书中(不确定是否有必要)。顺便说一句,我正在使用Windows 10。
  4. 使用here中的示例代码编写一个简单的代理服务器。 Cert.pem和Key.pem从第二步开始。
  5. 将应用程序中的所有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

看来我错过了一些重要的事情。你能告诉我如何用证书解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

拥有证书以及证书颁发机构的一个非常重要的目的是防止MITM 。您尝试欺骗的应用程序会执行正确的操作并检查证书。而且它不喜欢您的。真的很简单。

是否有可能绕过它并在应用程序上运行MITM?绝对!会容易吗?可能不会。您需要做的是修补应用程序并删除此证书检查。