链接两个使用openssl的库

时间:2017-05-01 13:06:22

标签: c++ openssl qt4 libcurl

  • 平台:GNU / Linux Debian Etch 32b
  • libcurl 7.37.1
  • qt 4.8.1
  • openssl 0.9.8

上面是一个包含我的应用程序依赖关系的架构(只有这个问题涉及的那个)

+-----------------+
| application     |
+-----------------+
| libcurl | libqt |
+-----------------+
| libssl          |
+-----------------+

我的c ++应用程序基于qt 4.8.1但是对于某些http /网络操作,我们使用libcurl 这两个库都是使用ssl支持编译的 我面临一个非常奇怪的错误场景:

  • Object1将 curl_easy_perform()运行到https网站。该呼叫报告错误。 curl_error_buffer包含:
  

错误设置证书验证位置:CAfile:   /etc/ssl/certs/ca-certificates.crt CApath:none

  • 稍后在Object2上调用 QSslSocket.write()

第二次调用会生成QTcpError。 QSslSocket报告的错误字符串是:

TCP Error: Error while reading: error:02001002:system library:fopen:No such file or directory, error:2006D080:BIO routines:BIO_new_file:no such file, error:0B084002:x509 certificate routines X509_load_cert_crl_file:system lib 

两个对象都存在于同一个应用程序线程中。

使用gdb跟踪应用程序行为,似乎是:

  • X509_load_cert_crl_file 调用是在curl_easy_perform()
  • 内执行的
  • 当调用方法 QSslSocket.write()时,函数: X509_load_cert_crl_file 不会被调用 netherless SSL堆栈返回到qt网络堆栈上面的错误。

我的想法是SSL lib状态在某种程度上是全局的(即errno)和/或在两个库(qt和libcurl)之间共享并执行QSslSocket.write()我们得到了libcurl调用先前设置的错误状态。

  • 有意义吗?
  • 我是以错误的方式使用libcurl,以致它使ssl连接处于某种不一致的状态?

请注意,qt write方法实际上在内部执行写入和从套接字读取。之后,使用 SSL_get_error

检查ssl的状态

(Qt代码:https://github.com/qt/qt/blob/v4.8.1/src/network/ssl/qsslsocket_openssl.cpp#L1140

0 个答案:

没有答案