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

C++ MITM代理,TLS 1.2证书验证失败,c++,ssl,openssl,x509,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 );

尝试为使用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创建代理密钥和证书进行签名
  • 这两个证书都已添加到个人和受信任的根证书颁发机构中的本地计算机证书中(不确定是否有必要)。顺便说一句,我使用的是Windows10
  • 使用中的示例代码编写了一个简单的代理服务器。Cert.pem和Key.pem从第二步开始
  • 将应用程序中的所有IP地址更改为127.0.0.1:443,以查看TLS连接是否成功建立,以及我们是否可以接收带有应用程序数据的第一条消息
  • 我认为建立连接是正确的,因为WireShark显示了建立TLS连接的常见顺序:客户机/服务器hello、证书、客户机密钥交换、两条加密握手消息。此外,使用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
    

    看来我错过了一些重要的事情。您能告诉我如何使用cert解决此问题吗?

    拥有证书以及证书颁发机构的目的之一就是防止MITM。您正在尝试的应用程序执行正确的操作并检查证书。而且它不喜欢你的。其实很简单


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

    谢谢您的回复。大量的“肮脏”方式(如修补)运行良好,包括修补X509\u verify\u cert(…)。如果你有兴趣,我想说最简单的方法是从应用程序内存中提取MS key和RAND,然后在路由器或中间PC上进一步解码。我希望有一种更干净的方法,不用阅读程序。看看Frida。一些钩子可以走很长的路。