使用curl,libcurl访问https

SpartacusIn21 SpartacusIn21     2022-09-01     688

关键词:

编译curl,libcurl

下载curl源码(git clone https://github.com/curl/curl),在目录curl\winbuild\BUILD.WINDOWS.txt文件中,详细介绍了使用nmake编译windows下curl及libcurl库的相关命令,摘录如下:

nmake /f Makefile.vc mode=<static or dll> <options>

where <options> is one or many of:
  VC=<6,7,8,9,10,11,12,14>     - VC versions
  WITH_DEVEL=<path>            - Paths for the development files (SSL, zlib, etc.)
                                 Defaults to sibbling directory deps: ../deps
                                 Libraries can be fetched at http://windows.php.net/downloads/php-sdk/deps/
                                 Uncompress them into the deps folder.
  WITH_SSL=<dll or static>     - Enable OpenSSL support, DLL or static
  WITH_MBEDTLS=<dll or static> - Enable mbedTLS support, DLL or static
  WITH_CARES=<dll or static>   - Enable c-ares support, DLL or static
  WITH_ZLIB=<dll or static>    - Enable zlib support, DLL or static
  WITH_SSH2=<dll or static>    - Enable libSSH2 support, DLL or static
  ENABLE_SSPI=<yes or no>      - Enable SSPI support, defaults to yes
  ENABLE_IPV6=<yes or no>      - Enable IPv6, defaults to yes
  ENABLE_IDN=<yes or no>       - Enable use of Windows IDN APIs, defaults to yes
                                 Requires Windows Vista or later, or installation from:
                                 https://www.microsoft.com/downloads/details.aspx?FamilyID=AD6158D7-DDBA-416A-9109-07607425A815
  ENABLE_WINSSL=<yes or no>    - Enable native Windows SSL support, defaults to yes
  GEN_PDB=<yes or no>          - Generate Program Database (debug symbols for release build)
  DEBUG=<yes or no>            - Debug builds
  MACHINE=<x86 or x64>         - Target architecture (default is x86)

  由编译命令可知,编译curl主要有两种ssl模式,默认是基于windows的winssl编译,另一种是基于openssl加密库。

一、curl+winssl

命令:

nmake /f Makefile.vc mode=dll vc=10 

这时默认使用SSPI、IDN、WINSSL等技术,编译后使用windows系统自带的CA数字证书文件、ssl加密库winssl(Schannel and Secure Transport),这种编译方式有很多优点,一是因为使用windows自带的加密库,没有跨平台等考虑因素,性能自然是最优的;二是不用引入第三方库openssl,也不需要显示设置https CA数字证书文件或者打包根证书到软件中。但是缺点也是很明显的,因为windows有很多系统版本,不同版本的ssl有较大区别,早期windows上的ssl安全性能没那么高;最严重的一个问题是,windows xp及以下系统在国内用户量还是很大的,而windows xp不支持SNI技术,如果服务器使用了SNI技术,而且同一个域名配置了多个证书,有可能导致返回证书错误,导致https访问失败。

SNI:Server Name Indication,是为了应对虚拟服务器技术的兴起而产生的,就是允许同一台服务器布置多个域名,在发起https请求的时候,会将请求的域名加到https请求头中,服务端收到请求后,根据请求头中的域名返回对应的根证书。

二、curl+openssl

命令:

nmake /f Makefile.vc mode=dll VC=10 WITH_DEVEL=OpenSLL编译目录 ENABLE_SSPI=no ENABLE_WINSSL=no

这种编译方式,首先得下载OpenSSL源码或者已经编译好的OpenSSL库,放到指定目录并设置到参数WITH_DEVEL参数中,具体的编译方式可参考http://www.cnblogs.com/openiris/p/3812443.html

基于OpenSSL编译的curl和libcurl,一大优点是使用的较新的SSL加密算法, 安全性较高,而且不需要考虑不同的操作系统SSL库不同导致的各种问题;缺点就是需要单独引入OpenSSL库,需要手动从Mozilla导出根证书,编译到OpenSSL或者打包到软件中,在curl中显示设置加载。 curl官网提供CA数字证书文件下载,地址是https://curl.haxx.se/ca/cacert.pem,更新地址是https://curl.haxx.se/docs/caextract.html 。

 远程更新CA数字证书命令(证书发生改变了才会下载):

curl --remote-name --time-cond cacert.pem https://curl.haxx.se/ca/cacert.pem

 

查看 CURL和LIBCURL版本/SSL/支持协议/特性

使用curl -V可以查看编译好的libcurl库支持的功能,以及支持的ssl库:

libcurl+winssl编译:

libcurl+openssl编译:

CURL HTTPS参数含义

一、CURL_VERIFY_PEER

该参数含义是验证HTTPS请求对象的合法性,就是用第三方证书机构颁发的CA数字证书来解密服务端返回的证书,来验证其合法性。可在编译时就将CA数字证书编译进去,也可以通过参数CURLOPT_CAINFO 或者CURLOPT_CAPATH设置根证书。默认值为1。

二、CURL_VERIFY_HOST

该参数主要用于https请求时返回的证书是否与请求的域名相符合,避免被中间着篡改证书文件。默认值为2。

 

LIBCURL基于WinSSL和OpenSSL访问HTTPS示例

一、忽略证书验证

如果不想验证PEER和HOST的安全性,可以通过设置

curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);//忽略证书检查
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);

二、LibCurl HTTPS 示例

WinSSL:

void winssl_Https()  
{  
    CURLcode res;  
    CURL* curl = curl_easy_init();      
  if(NULL == curl)  
    {  
        return CURLE_FAILED_INIT;  
    }  
    //...
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);//winssl编译时使用windows自带的根证书
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L);
   //...
  curl_easy_cleanup(curl); 
} 

 OpenSSL:

void openssl_https(const char * pCaPath)  
{  
    CURLcode res;  
    CURL* curl = curl_easy_init();     
  if(NULL == curl)  
    {  
        return CURLE_FAILED_INIT;  
    }  
  //...
  if(pCaPath){
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);//openssl编译时使用curl官网或者firefox导出的第三方根证书文件  
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L);
        curl_easy_setopt(curl, CURLOPT_CAINFO, pCaPath);/*pCaPath为证书路径 */
   else{     
     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); 
     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L); 
     curl_easy_setopt(curl, CURLOPT_CAINFO, "cacert.pem");//cacert.pem为curl官网下载的根证书文件 
  } 
  //...
  curl_easy_cleanup(curl); 
} 

  

参考资料:

a) https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html

b) https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html

c) https://curl.haxx.se/docs/sslcerts.html

使用 Nginx 的 https SSL 证书验证因自定义构建的 libcurl+openssl 而失败,但适用于系统 curl

】使用Nginx的httpsSSL证书验证因自定义构建的libcurl+openssl而失败,但适用于系统curl【英文标题】:httpsSSLcertverificationwithNginxfailswithcustombuiltlibcurl+openssl,butworkswithsystemcurl【发布时间】:2011-09-1123:49:38【问题描述】:我正在使用libcur... 查看详情

libcurl库的安装及使用说明(代码片段)

目录一  libcurl库安装①下载网址②libcurl库安装步骤③libcurl等第三方库的通用编译方法二  调用libcurl编程访问百度主页 ①代码说明②编译说明③执行说明三  libcurl的使用说明①curl相关函数简介 ② curl_easy_setopt函数部分选... 查看详情

curl资源的初步使用

     PHP支持的由DanielStenberg创建的libcurl库允许你(模拟)与各种的服务器使用各种类型的协议进行连接和通讯。libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTPPOST... 查看详情

GuzzleHttp\Exception\RequestException cURL 错误 3:(参见 https://curl.haxx.se/libcurl/c/libcurl-errors.ht

】GuzzleHttp\\\\Exception\\\\RequestExceptioncURL错误3:(参见https://curl.haxx.se/libcurl/c/libcurl-errors.html)在安装laravel6时【英文标题】:GuzzleHttp\\Exception\\RequestExceptioncURLerror3:(seehttps://curl.haxx.se/libcurl/c/libcurl-er 查看详情

使用libcurl下载文件小例

libcurl是一个很强大的开源网络处理库,支持包括HTTP、HTTPS、FTP……一系列网络协议。用它来进行HTTP的getpost或者下载文件更是小菜一碟,chrome内核都用到了它,本文主要讲解一个使用curl下载文件的小例。首先是去下载curl的最新... 查看详情

libcurl库——http协议实现(代码片段)

目录Libcurl库简介Libcurl的使用curl_easy_setopt()里的部分函数测试回调函数安装编程注意的小TIPSLibcurl库简介libcurl是跨平台网络协议库,支持应用层http,https,ftp,gopher,tellnet,dict,file,dap协议libcurl同样支持HTTPS证书授权,HTTPPOST,HTTPP... 查看详情

curl不能支持https问题

默认情况下,libcurl不支持https,如果使用https链接,就会出现" Protocolhttpsnotsupportedordisabledinlibcurl"的错误提示。查看curl是否支持https可以使用命令:curl-V。curl有两种方式使用https:1.设定为不验证证书和HOSTcode=curl_easy_setopt(handle,CU... 查看详情

curl啥意思

...统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。cURL支持的通信协议有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。PHP、cURL函数:PHP支持的由DanielStenberg创建的libcurl... 查看详情

编译libcurl支持https协议

编译与安装参考:http://www.cnblogs.com/openiris/p/3812443.html注意事项:先下载安装完nasm和perl再打开控制台(需要将nasm安装路径添加到Path环境变量中)。curl:     https://curl.haxx.se/download/curl-7.37.0.zipopenssl:  ftp://ftp.openssl.org/sn 查看详情

常用libcurl异步使用方法

参考技术A1背景知识2libcurl基础知识3libcurl两种模式4libcurl实例分析1背景知识:1.1基本网络通信cs模式,select框架,网上例子很多.下面只介绍epoll的难点.其他内容请自行搜索.1.2epoll用法1.2.1基础知识:在自己端准备write之前,通过epollctrl设... 查看详情

libcurl安装

下载libcurl  https://curl.haxx.se/latest.cgi?curl=zip    解压进入解压目录mkdirbuildcmake  ..make-j16makeinstall库安装在/usr/local/lib64/libcurl.so --Installing:/usr/local/bin/curl-config--Installing:/usr/local/lib64/pkgconfig/libcurl.pc--Ins... 查看详情

使用 libcurl 的 CA 证书认证

】使用libcurl的CA证书认证【英文标题】:CAcertificateauthenticationusinglibcurl【发布时间】:2015-02-1919:35:34【问题描述】:我在获取证书以使用libcurl时遇到问题。C++代码:#include<stdio.h>#include<curl/curl.h>intmain(void)CURL*curl;CURLcodere... 查看详情

在尝试访问 HTTPS url 时如何使用 cURL 处理证书?

】在尝试访问HTTPSurl时如何使用cURL处理证书?【英文标题】:HowdoIdealwithcertificatesusingcURLwhiletryingtoaccessanHTTPSurl?【发布时间】:2011-03-1019:24:04【问题描述】:我在使用curl时遇到以下错误:curl:(77)错误设置证书验证位置:CAfile... 查看详情

使用 Git 的 libcurl 中不支持或禁用协议 https

】使用Git的libcurl中不支持或禁用协议https【英文标题】:ProtocolhttpsnotsupportedordisabledinlibcurlusingGit【发布时间】:2013-03-1107:05:29【问题描述】:我有几个github存储库,它们在过去几个月里运行良好。但是,几天前我在尝试推送时... 查看详情

使用 libcurl 执行 HTTP POST - 摘要式身份验证,使用 curl_easy_send\ curl_easy_recv

】使用libcurl执行HTTPPOST-摘要式身份验证,使用curl_easy_send\\\\curl_easy_recv【英文标题】:PerformHTTPPOSTwithlibcurl-digestauthentication,usingcurl_easy_send\\curl_easy_recv使用libcurl执行HTTPPOST-摘要式身份验证,使用curl_easy_send\\curl_easy_recv【发布时间... 查看详情

android:使用libevent和libcurl去实现http和https服务器,用来测试android客户端程序(代码片段)

记录一下一篇好的博文:使用libevent和libcurl去实现http和https服务器http://eleaction01.spaces.eepw.com.cn/articles/article/item/183383前言libevent和libcurl都是功能强大的开源库;libevent主要实现服务器,包含了select、epoll等高并发的实... 查看详情

如何使用curl访问https类型的网站

参考技术A简易方法(不安全)curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);安全方法:用firefox查出网站的CAcertificate,下戴,然后curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,true);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);curl_setopt($ch,CURLOPT_CAINFO,getcwd()."/CAcerts/B... 查看详情

vs2022编译libcurl

...程②预处理器添加 CURL_STATICLIB③链接输入中添加  libcurl_a_debug.li 查看详情