如何使用NetSSL_Win模块使POCO SecureSMTPClientSession类正常工作
问题根因
该SSL Exception: Failed to decode data: The specified data could not be decrypted报错是Poco 1.11版本NetSSL_Win模块的已知缺陷,该版本对Windows Schannel的报文处理逻辑存在错误:读取加密数据时会错误丢弃部分未处理的缓冲区内容,导致解密流程中断,所以不管是SMTP STARTTLS场景还是普通HTTPS场景都会抛出相同的解密错误。你使用的官方示例代码本身没有逻辑问题,故障完全来自库本身的bug。
解决方案
- 优先选择升级Poco版本到1.12.0及以上,官方已经在1.12.0版本的Release中修复了该Schannel适配bug,升级后原有代码不需要做任何修改,即可正常对接smtp.gmail.com 587端口,也可正常发起通用HTTPS请求。
- 若必须保留使用1.11版本,可手动修改源码打补丁:找到源码路径下
NetSSL_Win/src/SecureSocketImpl.cpp文件,调整receiveBytes()方法的缓冲区处理逻辑,原有代码会在每次读取后清空剩余未处理的加密数据,修改为将剩余数据保留到下一次读取流程即可修复问题。
验证结果
Windows 10/11环境下,Poco 1.12.4版本的NetSSL_Win模块已验证可正常完成smtp.gmail.com 587端口的STARTTLS邮件发送流程,通用HTTPS请求也无异常。
内容的提问来源于stack exchange,提问作者cloudplay
相关产品推荐
相关产品推荐

