我们已经将我们的 gsoap stubs c++ 放入自定义动态库中,并针对我们的主程序进行链接和构建。
当我使用 https 调用时,我从 openssl 得到 ERROR_SYSCALL 并看到它在 SSL_Connect 中失败。
准确的错误是:
sk_sort:0xb6cc1680
SOAP 1.2 fault SOAP-ENV:Receiver [no subcode]
"SSL_ERROR_SYSCALL
Error observed by underlying SSL/TLS BIO: Connection reset by peer"
Detail: SSL_connect error in tcp_connect()
如果我直接在我们的主程序中使用相同的代码,它可以正常工作...
我错过了什么?我们的自定义库是动态的,链接也是动态的 openssl...
亲切的问候
最佳答案
不完全是自定义库的问题,而是最新的 GSOAP 的问题。 Gsoap 添加了 SSL_set_tlsext_host_name 以将 SNI 与 TLS 结合使用。如果您使用带有默认 SSL 证书的基于 IP 的服务器,例如没有 SNI 那么所有调用都将失败并显示 ERROR_SYSCALL
所以我们暂时这样解决了:
SSL_set_tlsext_host_name(soap->ssl, host) - 这会导致 ERROR SYSCALL,因为我们使用的是 IP 而不是主机名。服务器丢弃链接,因为主机名是 ip 而不是有效名称。由于我们需要使用 IP 而不是主机名,并且 gsoap 不为此使用任何标志,因此我们注释掉了 stdsoap2.cpp 中的部分
我们只是在 stdsoap2.cpp 中搜索 SSL_set_tlsext_host_name 并注释掉。
可能 Gsoap 应该为此设置一个标志?
关于c++ - 来自自定义库的 Openssl 和 gsoap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39798828/