zoukankan      html  css  js  c++  java
  • 解决Curl下载https地址文件出错的问题

    问题描述

    使用curl下载https地址文件时,调用 curl_easy_perform 函数返回错误码60,表示CURL_SSL_CACERT错误,大概的意思是没有设置证书。当前使用的 curl版本为:libcurl/7.28.1 OpenSSL/1.0.1u zlib/1.2.2

    问题分析

    按图索骥,据此错误码,可在网上搜索到如下文章:

    curl_easy_perform gives error code CURLE_SSL_CACERT
    使用CURL 返回错误码:CURLE_SSL_CACERT,请问如何设置SA证书!

    浏览器在访问https站点,会通过内置的信任根证书来验证服务器有效性。具体验证方法有:

    • 查看证书的颁发者是否受信任
    • 验证证书是否吊销(下载已吊销证书列表对比或实时验证)
    • 验证证书是否在有效期
    • 验证服务端是否是该证书的持有者。

    curl在访问https地址时,默认会开启有效性验证,具体有验证服务器证书真实性以及服务器是否是该证书的持有者。

    验证服务器证书真实性

    此项验证,由 CURLOPT_SSL_VERIFYPEER 选项控制,设置1表示开启验证,0表示关闭验证。
    curl使用默认CA证书列表(证书搜索路径由编译时决定),可通过CURLOPT_CAINFO或者 CURLOPT_CAPATH 选项更改受信任根证书路径。

    验证服务器是否是该证书持有者

    此项验证,由 CURLOPT_SSL_VERIFYHOST 选项控制,该选项有以下几种取值:

    • 0:忽略证书认证
    • 1:7.28.1版本的,设为1不会改变该标志。 7.66.0版本,1与2效果一样。
    • 2:对端服务器必须是证书的持有者。具体通过证书中的Common Name field 或者Subject Alternate Name field,来验证请求url中的域名是否有效。(默认值)

    问题解决

    根据上述的分析,有如下几种解决方案:

    方案一:关闭curl下载https文件的安全验证。具体方法如下:

    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);

    方案二:开启验证,并指明验证依赖的CA证书路径。

    下载证书有效性校验文件,下载地址点此进,下载完成后,将该文件放在程序所在目录,然后添加如下

    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1L);
    curl_easy_setopt(hCurl, CURLOPT_SSL_VERIFYPEER, 1L);
    curl_easy_setopt(hCurl, CURLOPT_CAINFO, ".cacert.pem");

    CURLOPT_CAINFO:指定证书文件全路径,使用相对路径即可。
    CURLOPT_CAPATH:指定证书所在目录,官方文档里面说:The CURLOPT_CAPATH function apparently does not work in Windows due to some limitation in openssl。在windows上不建议使用该选项。

  • 相关阅读:
    Elasticsearch学习之基本核心概念
    Kudu,支持快速分析的新型Hadoop存储系统
    npm命令
    git相关命令
    Linux下Nodejs安装(完整详细)转
    数据库删除discuz 部分数据操作
    用tcping检查网站开放的端口
    Mybatis各种模糊查询
    抱歉,当前存在网络问题或服务器繁忙错误代码:20003问题解决方法
    win7下python2.7安装 pip,setuptools的正确方法
  • 原文地址:https://www.cnblogs.com/cherishui/p/13997087.html
Copyright © 2011-2022 走看看