我们已将gsoap存根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 ...
亲切的问候
答案 0 :(得分:0)
不是自定义库的问题,而是最新的GSOAP。 Gsoap添加了SSL_set_tlsext_host_name以将SNI与TLS一起使用。如果您使用基于IP的服务器和默认SSL证书,例如没有SNI然后所有调用都将失败并出现ERROR_SYSCALL
所以我们现在解决这个问题:
SSL_set_tlsext_host_name(soap-> ssl,host) - WHICH导致ERROR SYSCALL,因为我们使用的是IP而不是主机名。并且服务器丢弃链接,因为主机名是ip而不是有效名称。由于我们需要使用IP而不是主机名,而gsoap不使用任何标志,我们在stdsoap2.cpp中注释掉了部分
我们刚刚在stdsoap2.cpp中搜索了SSL_set_tlsext_host_name并注释掉了。
可能Gsoap应该有一个标志吗?