SSL_set_SSL_CTX
设置上下文(它可能已经存在,或者我刚刚在欺骗上游证书后创建了它),然后启动服务器(下行)读/写往返以及上游。在存储和共享上下文之前,这是有效的。对于每个新的传入连接,我都会创建一个新的客户端套接字和上下文,加载ca-bundle作为验证文件,然后创建一个新的服务器上下文,并获取伪造的证书。虽然它可以正常运行,但我开始遇到EC_KEY对象被双重释放等问题。我从我的另一个问题中了解到,我走错了路,并开始重构以重复使用和共享CTX对象。具体来说,我正在全面使用一个单一的客户端CTX,该CTX在程序启动时加载用于验证的CA-Bundle。
然而,自从进行了这次重构后,无论是客户端还是服务器,我都得到了以下内容:
decryption failed or bad record mac
与无数“短读”混杂的内容。如果我尝试强制使用TLSv1.2,就会出现...
block cipher pad is wrong
在读写失败后,当我调用上游或下游套接字的async_shutdown
时,会出现这些错误,在回调中,设置了错误(因此关闭失败)。
我仔细查找了互联网上的Jira帖子,例如来自Apache httpd和Nginx等地方,在这些地方,通过不同的方式修复了这个错误(将读缓冲区大小调整更大,进行openSSL补丁,强制使用SSLv3等等)。
我认为可能存在多线程问题(我的io-service使用线程池),但我可以在代码中看到,boost do_init为openSSL设置了锁定机制,并且所有的IO都包装在一个单一的strand中。
我完全不知所措,想知道可能发生了什么。我意识到我没有发布任何代码,这是因为我有成百上千行的代码,不想以巨大的代码转储来打击人们的热情。不过,我也意识到这是一个相当复杂的程序,因此也是一个复杂的问题,所以请随便问,我会提供我所能提供的一切。
编辑
我想我应该提到,我在openssl 1.0.2和1.0.2a、Win 8.1 x64上都遇到了这些错误,我使用WinDivert拦截和路由http/https流量通过我的代理。
编辑2
将整个程序减少到1个线程,效果相同。为每个客户端连接创建新的客户端CTX,问题仍然存在。尝试禁用AES-NI,问题仍然存在。尝试不同的计算机,效果相同。重新编译openssl源代码(之前使用的是预编译二进制文件),问题仍然存在。尝试设置相关的OP_ workaround标志,以便与降级检测、填充漏洞等有关的当前文档描述相匹配,问题仍然存在。我想我很快就会开始随机地敲键盘和编译按钮了。