尝试为使用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*/ };
我执行了以下步骤来获得结果:
我认为连接建立正确,因为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
看来我错过了一些重要的事情。你能告诉我如何用证书解决这个问题吗?
答案 0 :(得分:1)
拥有证书以及证书颁发机构的一个非常重要的目的是防止MITM 。您尝试欺骗的应用程序会执行正确的操作并检查证书。而且它不喜欢您的。真的很简单。
是否有可能绕过它并在应用程序上运行MITM?绝对!会容易吗?可能不会。您需要做的是修补应用程序并删除此证书检查。