curl 是利用 URL 语法在命令行方式下工作的开源文件传输工具,是命令行工具,可以通过shell或脚本来运行 curl。curl 底层所使用的库是 libcurl。使用 curl -V 可以查看编译好的 libcurl 库支持的功能,以及支持的 ssl 库。windows power shell 自带了 curl 命令,可以通过 curl http://baidu.com 或 curl https://baidu.com 来测试,本人自编译的 curl 测试 https 需要带证书参数 curl https://baidu.com --cacert cacert.pem 来测试。
libcurl 是一个免费开源的,高度可移植的,客户端 url 传输库,可以工作在不同的平台上,支持Windows,Unix,Linux等。支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。
编译 curl 主要有两种 ssl 模式,默认是基于 windows 的 winssl 编译,另一种是基于 openssl 加密库
curl + winssl:这时默认使用 SSPI、IDN、WINSSL 等技术,编译后使用 windows 系统自带的 CA 数字证书文件、ssl 加密库 winssl(Schannel and Secure Transport)
优点:使用 windows 自带的加密库,没有跨平台等考虑因素,性能自然是最优的;不用引入第三方库 openssl,也不需要显示设置 https CA 数字证书文件或者打包根证书到软件中。
缺点:windows 不同系统版本的 ssl 有较大区别,早期 windows 上的 ssl 安全性能没那么高;windows xp 不支持 SNI (Server Name Indication) 技术; 有可能导致返回证书错误,导致 https 访问失败。
curl + openssl:
优点:使用的较新的 SSL 加密算法, 安全性较高,而且不需要考虑不同的操作系统SSL库不同导致的各种问题
缺点:需要单独引入 OpenSSL 库,在 curl 中显示设置加载证书。 curl 官网提供 CA 数字证书文件下载,地址是 https://curl.haxx.se/ca/cacert.pem
- 下载安装准备工具 ActivePerl,该工具 64 位的也可以支持编译 32 位程序,下载地址:https://www.activestate.com/products/perl/downloads/
- 下载安装准备工具 cmake,该工具 64 位的也可以支持编译 32 位程序,下载地址:https://cmake.org/download/
- 下载安装准备工具 openssl,源码下载地址:https://github.com/openssl/openssl,二进制下载地址:http://slproweb.com/products/Win32OpenSSL.html,本人用的是安装版 Win32OpenSSL-1_1_1h
- 下载安装准备工具 libssh2,源码下载地址:https://github.com/libssh2/libssh2,本人编译的是 libssh2-1.8.2 版本,CMake 时要确保勾选 BUILD_SHARED_LIBS
- 下载安装 curl,源码下载地址:https://github.com/curl/curl,本人编译的是 curl-7_73_0 版本,需要配置编译好的 libssh openssl 安装路径到系统环境变量,CMake 时要确保勾选 BUILD_SHARED_LIBS CMAKE_USE_OPENSSL
libcurl 访问 https 示例
如果不想验证PEER和HOST的安全性,可以通过设置忽略证书验证
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
设置证书
curl_easy_setopt(curl, CURLOPT_CAINFO, “cacert.pem”);
常见错误
- schannel: next InitializeSecurityContext failed: SEC_E_ILLEGAL_MESSAGE (0x80090326) - This error usually occurs when a fatal SSL/TLS alert is received (e.g. handshake failed). More detail may be available in the Windows System event log. 这是使用 winssl 而没有使用 openssl,因为系统自身未支持的原因造成的
- error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version. 这是 ssl 版本不兼容的原因造成的
- SSL certificate problem: unable to get local issuer certificate. 这是取不到证书造成的
如果您不想编译,或未编译成功,可以直接下载我编译好的 32 位 release 版本:https://download.youkuaiyun.com/download/XiaoStore/13126050

本文介绍了curl及其依赖库libcurl的工作原理,着重讲解了如何在Windows上编译curl时选择openssl作为SSL库。讨论了winssl和openssl的优缺点,并提供了编译所需的工具下载链接。此外,文章还给出了libcurl访问https的示例代码,包括忽略证书验证和设置证书的方法,以及可能遇到的错误及解决办法。
813





