libcurl:https认证控制参数简介

目录

1 背景

2 curl命令

3 libcurl 控制参数

4 双向认证

5 参考文档


1 背景

        在使用浏览器访问https链接时,浏览器会自动请求网站的安全证书,并进行证书校验,以及(使用证书)参与后续的通道加密逻辑。

        而使用curl(不管是curl.exe命令行工具,还是使用libcurl库)请求https时,在curl的标准逻辑里面,它也会使用类似浏览器的流程,进行证书校验和加密,此时这个证书校验流程对于使用者来说,可能是需要定制的(譬如不校验,标准校验,甚至双向校验东等)。

        本文主要讨论通过设置libcurl的参数,来控制这个校验过程。

2 curl命令

        2.1 忽略证书校验
        curl --location "https://s.example.com/" --insecure

        2.2 指定CA证书
        curl --cacert "<path of ca.pem>"

3 libcurl控制参数(终端验证服务器)

        3.1 CURLOPT_CAINFO 
        3.1.1 指定一个具体的CA证书路径(完整路径)
        3.1.2 https://curl.se/libcurl/c/CURLOPT_CAINFO.html
        3.1.3 e.g.

CURL *curl = curl_easy_init();
if(curl) {
  curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
  curl_easy_setopt(curl, CURLOPT_CAINFO, "/etc/certs/cabundle.pem");
  ret = curl_easy_perform(curl);
  curl_easy_cleanup(curl);
}

        3.2 CURLOPT_CAPATH 
        3.2.1 指定一个CA证书的路径(里面可以放置多个证书)
        3.2.2 https://curl.se/libcurl/c/CURLOPT_CAPATH.html

        3.3 CURLOPT_SSL_VERIFYPEER
        3.3.1 https://curl.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html
        3.3.2 是否校验服务器证书,设置为1(缺省值)表示校验,设置为0表示不校验
        3.3.3 e.g.

CURL *curl = curl_easy_init();
if(curl) {
  curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
 
  /* Set the default value: strict certificate check please */
  curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
 
  curl_easy_perform(curl);
}

        3.4 CURLOPT_SSL_VERIFYHOST
        3.4.1 https://curl.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html
        3.4.2 这个值配合3.3的CURLOPT_SSL_VERIFYPEER使用,标识校验服务器证书的哪些内容。设置为2(缺省值)表示既校验证书的有效性,并且要校验证书的Common Name和实际访问的域名是匹配的(也就是标准的严格校验)。设置为0则表示只校验证书的有效性,不校验证书的Common Name。
        3.4.3 如果 CURLOPT_SSL_VERIFYPEER 设置为0,则设置 CURLOPT_SSL_VERIFYHOST 无意义(会被libcurl自动设置为0)。
        3.4.4 另外一些历史原因,这个值 CURLOPT_SSL_VERIFYHOST 曾经可以设置为1,在新版libcurl里面已经废除,可以参考3.4.1的相关内容。

4 双向认证参数

        4.1 一般双向认证指客户端认证服务端,并且服务端也认证客户端。但是因为客户端认证服务端比较常见,这里只讨论服务端认证客户端的情形下,终端需要设置的参数,这种场景下客户端须向服务端提供自己的证书。

        4.2 CURLOPT_SSLCERTTYPE
        4.2.1 https://curl.se/libcurl/c/CURLOPT_SSLCERTTYPE.html
        4.2.2 指定终端证书的类型:一般是 "PEM" or "DER"。

        4.3 CURLOPT_SSLCERT
        4.3.1 https://curl.se/libcurl/c/CURLOPT_SSLCERT.html
        4.3.2 指定终端证书的完整路径,一般是和 CURLOPT_SSLCERTTYPE 一起使用。

        4.4 CURLOPT_SSLKEYTYPE
        4.4.1 https://curl.se/libcurl/c/CURLOPT_SSLKEYTYPE.html
        4.4.2 配合CURLOPT_SSLKEY使用,指定终端证书私钥类型,一般使用 "PEM" 格式

        4.5 CURLOPT_SSLKEY
        4.5.1 https://curl.se/libcurl/c/CURLOPT_SSLKEY.html
        4.5.2 指定终端证书的私钥文件全路径(嘿,为什么要指定私钥?大家可以思考下!)。

        4.6 CURLOPT_KEYPASSWD
        4.6.1 https://curl.se/libcurl/c/CURLOPT_KEYPASSWD.html
        4.6.2 指定私钥证书的密码,配合 CURLOPT_SSLKEY 使用。
        4.6.3 e.g.

CURL *curl = curl_easy_init();
if(curl) {
  curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
  curl_easy_setopt(curl, CURLOPT_SSLCERT, "client.pem");
  curl_easy_setopt(curl, CURLOPT_SSLKEY, "key.pem");
  curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "superman");
  ret = curl_easy_perform(curl);
  curl_easy_cleanup(curl);
}

5 参考文档

        [1] linux c++ curl https 请求并双向验证SSL证书 https://www.cnblogs.com/yongpan/p/8084854.html

        [2] 证书类型原理及转换方式 https://segmentfault.com/a/1190000011709784

        [3] https双向认证 https://blog.csdn.net/u014644574/article/details/126190061

        [4] HTTPS运行流程 https://zhuanlan.zhihu.com/p/60033345

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libcurl支持https双向认证。在使用libcurl进行https连接时,可以使用以下参数进行配置: 1. CURLOPT_SSLCERTTYPE: 设置证书的格式,支持PEM和DER格式。 2. CURLOPT_SSLCERT: 设置客户端证书的文件名,加密传输下默认格式是P12,其它方式下是PEM。建议使用相对路径来避免混淆。 3. CURLOPT_SSLKEY: 设置私钥文件的文件名,默认格式是PEM。可以通过CURLOPT_SSLKEYTYPE来修改私钥格式。 4. CURLOPT_KEYPASSWD: 当使用私钥文件时,可能需要设置密码。加载证书时不需要密码,但加载私钥时需要。 5. CURLOPT_CAINFO: 设置根证书,用于验证对端证书的有效性。一般是由证书颁发机构(CA)颁发的证书。 6. CURLOPT_SSL_VERIFYPEER: 决定是否验证对方证书的有效性。当进行TLS或SSL连接时,服务器会发送证书以证明身份,CURL会验证证书的真实性。此验证基于数字签名链,以您提供的证书颁发机构(CA)的证书为基础。 双向认证需要配置客户端证书和私钥,并设置CURLOPT_SSLCERT和CURLOPT_SSLKEY参数。 参考文献: https://blog.csdn.net/chary8088/article/details/22950843 https://blog.csdn.net/wu110112/article/details/72898630 Makefile中的参数说明<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [在windows平台用libcurl双向认证](https://blog.csdn.net/thanklife/article/details/79848165)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [HTTPS认证四:使用开源libcurl进行SSL双向认证](https://blog.csdn.net/egbert123/article/details/103832664)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值