分辨
构建配置错误。
官方"祝福"我们系统上的curl和OpenSSL实现可悲过时(OpenSSL 0.9.8)。我与之通信的所有应用程序都不接受TLS v1.2以下的任何内容,因此我在我的主目录下下载并构建了OpenSSL 1.1和Curl 7.48。
但是,即使我在--with-ssl=/my/tools/ssl
命令中指定configure
来构建Curl,它仍然在/ etc / lib下获取旧版本的libssl。
我必须执行以下操作才能正确构建Curl:
#
# make sure prefix in /my/tools/lib/pkgconfig/libcurl.pc is set to
# /my/tools
#
CFG_PACKAGE_PATH=/my/tools/lib/pkgconfig:$CFG_PACKAGE_PATH
CPPFLAGS="-I/my/tools/include"
LDFLAGS="-L/my/tools/lib/"
./configure --prefix=/my/local --with-ssl
之后,Curl正确链接到我的本地OpenSSL构建并正常工作。
ORIGINAL
资料 -
OS: SLES 10
Compiler: g++ 4.1.2
libcurl: 7.48.0
OpenSSL: 1.0.21
我们有一个C ++应用程序,它使用libcurl通过OpenSSL连接到URL。我收到了SSL连接错误,因为根据远程站点的管理员,我们正在尝试连接已禁用的TLS 1.0。但是,我在我的代码中明确地将协议设置为TLS版本1.2,如下所示:
if ( curl_easy_setopt( m_curlHandle, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2 ) != CURLE_OK)
m_log.logv( LOG_ERR, "%s - Cannot set SSL version to TLS 1.2!", __PRETTY_FUNCTION__ );
我没有收到错误消息,因此SSL版本应设置为TLS 1.2,但由于某种原因,它会以TLS 1.0的形式发送出去。
我试图提取会话信息以尝试验证事情的设置方式,因此我使用curl_easy_getinfo
函数,但它返回错误CURLE_BAD_FUNCTION_ARGUMENT的代码。我已经完成了对CURL文档的调用,据我所知,我已经通过了预期的事情。
以下是代码的内容(而不是完全代码,但操作顺序和调用本身就能准确反映出来):
CURL *m_curlHandle;
...
curl_global_init( CURL_GLOBAL_ALL );
m_curlHandle = curl_easy_init( ) ;
curl_easy_setopt( m_curlHandle, CURLOPT_USERAGENT, "libcurl-agent/1.0" );
curl_easy_setopt( m_curlHandle, CURLOPT_SSL_VERIFYPEER, 1 );
curl_easy_setopt( m_curlHandle, CURLOPT_SSL_VERIFYHOST, 2 );
curl_easy_setopt( m_curlHandle, CURLOPT_POST, 1L );
curl_easy_setopt( m_curlHandle, CURLOPT_TIMEOUT, 60 );
curl_easy_setopt( m_curlHandle, CURLOPT_NOPROGRESS, 1L );
curl_easy_setopt( m_curlHandle, CURLOPT_ERRORBUFFER, &m_curlErrBuffer );
curl_easy_setopt( m_curlHandle, CURLOPT_WRITEFUNCTION, write_data );
curl_easy_setopt( m_curlHandle, CURLOPT_READFUNCTION, read_data );
curl_easy_setopt( m_curlHandle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
...
if ( curl_easy_setopt( m_curlHandle, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2 ) != CURLE_OK)
m_log.logv( LOG_ERR, "%s - Cannot set SSL version to TLS 1.2!", __PRETTY_FUNCTION__ );
...
struct curl_tlssessioninfo *session;
CURLcode result;
result = curl_easy_getinfo( m_curlHandle, CURLINFO_TLS_SSL_PTR, &session );
根据文档here,我将正确的参数传递给curl_easy_getinfo
,因此这变得特别令人沮丧。
任何人都有任何想法a)我如何验证我是否在传出消息上使用TLS 1.2,以及2)如何正确提取会话信息?
提前致谢。