在Visual Studio中使用libcurl


0x0 前言

最近的一个C++项目中需要实现发送http请求的功能,计划使用有名的开源库libcurl来做。 相关工具和代码的版本以及一些约定如下:

Visual Studio 2022

curl 8.1.2

openssl 3.1.1

strawberryperl 5.32.1.1 x64

nasm 2.16.01 x64

curl代码的根目录是"C$"

openssl代码的根目录是"O$"

项目代码的根目录是"P$"

0x1 编译libcurl静态库和动态库

先在curl的github仓库获取源代码,这一步必须使用git clone来完成,否则没法完成后面的步骤。获取到代码 后进入C$\projects,执行其中的generate.bat。脚本运行完成后进入C$\projects\Windows\VCXX\lib。其中XX和稍 后要使用的Visual Studio的版本有关,根据脚本中的注释,对应关系如下:

VC10 - Visual Studio 2010

VC11 - Visual Studio 2012

VC12 - Visual Studio 2013

VC14 - Visual Studio 2015

VC14.10 - Visual Studio 2017

VC14.30 - Visual Studio 2022

进入目录,使用对应版本的Visual Studio打开libcurl.sln,在菜单栏选择名称为"DLL Release"的生成配置,平台选择x64。 选择生成配置 执行生成->生成解决方案,等待编译完成。编译完成后,进入C$\build\Win64\VCXX\DLL Release,可以看到生成 了libcurl.dll和libcurl.lib两个文件,创建P$\libs文件夹,并把libcurl.lib复制到该文件夹中,再新建P$\include文件夹,把C$\include\curl复制到文件夹中。

在Visual Studio中打开“项目属性”窗口,选择“链接器”->“常规”,把P$\libs添加到“附加依赖项”中,选择"C\C++“->“常规”,把P$\include添加到"附加包含目录”。可以用相对路径,但是实测可能会出错,所以用绝对路径比较保险。

根据官方文档写好代码后,编译项目,编译通过。但运行的时候提示找不到libcurl.dll。把刚才编译的libcurl.dll复 制到生成的exe所在的目录,就能正常运行了。

0x2 让libcurl支持https

0x1中编译出来的libcurl不支持https,试图访问https网站时会返回错误码1(不支持的协议)。为了添加https支持, 需要第三方tls库的支持。这里使用openssl。

先从openssl的github release下载openssl源代码并解压。这里不建议使用git clone。一方面openssl主分支的代码不断在更新,不能保证稳定性,另一方面openssl仓库占空间非常大,光是主分支就有几百MB。

编译openssl还需要用到perl和nasm,分别从strawberryperl.comnasm.us下载。

上述工具下载配置好(nasm需要放到PATH包括的文件夹中,似乎不会在安装时自动设置)之后,进入C$\projects并执行build-openssl.bat,需要输入几个参数,脚本的帮助信息写得很详细,不啰嗦。这里使用的是

build-openssl.bat vc14.3 x64 release D:\develop\openssl -perlpath "D:\develop\strawberryperl"

编译过程大约需要二十分钟,编译好openssl后,把O$\build\Win64\VC14.30\DLL Release\include\openssl复制到C$\include。重新打开刚才的libcurl.sln,选择DLL Release - DLL OpenSSL配置,生成解决方案。编译完成后可以在C$\build\Win64\VCXX\DLL Release - DLL OpenSSL找到编译的输出文件。

像0x1中一样把libcurl.lib和libcurl.dll分别复制到两个文件夹中,libcurl就支持https网站的访问了。但编译出来的程序需要libssl-3-x64.dll和libcrypto-3-x64.dll才能正常运行,这两个文件也在C$\build\Win64\VCXX\DLL Release - DLL OpenSSL中,需要复制到exe所在的文件夹中才能正常运行。

0x3 向libcurl提供可信的ca列表

似乎是出于安全考虑,libcurl默认的配置是不信任任何ca,当试图访问任何https网站的时候会返回错误码60(无法验证证书),因此需要手动给libcurl提供一个可信的ca列表。在curl官网下载cacert.pem文件,放到P$\中。在代码中添加如下函数调用:

curl_easy_setopt(curlhandle, CURLOPT_CAINFO, "cacert.pem");

就可以正常访问https网站了。


文章作者: LouisZ
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 LouisZ !
  目录