【问题标题】:curl: (60) SSL certificate problem: when uploading behind proxycurl:(60)SSL证书问题:在代理后面上传时
【发布时间】:2020-11-20 15:35:54
【问题描述】:

我需要在公司代理后面进行 curl 上传。根据我尝试的网站,我遇到了以下两种类型的问题,

  • curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number
  • curl: (60) SSL 证书问题:无法获取本地颁发者证书

详情如下:

案例 1:

. . . 
< HTTP/1.1 200 Connection established
< Proxy-agent: CCProxy
< 
* Proxy replied 200 to CONNECT request
* CONNECT phase completed!
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* CONNECT phase completed!
* CONNECT phase completed!
* error:1408F10B:SSL routines:ssl3_get_record:wrong version number
* Closing connection 0
curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number

案例 2:

$ curl -vX POST -d "userId=5&title=Hello World&body=Post body." https://jsonplaceholder.typicode.com/posts
Note: Unnecessary use of -X or --request, POST is already inferred.
* Uses proxy env variable https_proxy == 'http://10.xx.xx.xx:808/'
*   Trying 10.xx.xx.xx:808...
* TCP_NODELAY set
* Connected to 10.xx.xx.xx port 808 (#0)
* allocate connect buffer!
* Establish HTTP proxy tunnel to jsonplaceholder.typicode.com:443
> CONNECT jsonplaceholder.typicode.com:443 HTTP/1.1
> Host: jsonplaceholder.typicode.com:443
> User-Agent: curl/7.68.0
> Proxy-Connection: Keep-Alive
> 
< HTTP/1.1 200 Connection established
< Proxy-agent: CCProxy
< 
* Proxy replied 200 to CONNECT request
* CONNECT phase completed!
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* CONNECT phase completed!
* CONNECT phase completed!
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (OUT), TLS alert, unknown CA (560):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

问题不是上面的CCProxy,而是我们公司使用的是Zscaler透明代理,它用自己的证书拦截SSL请求。

请问有什么办法可以解决吗?

$ curl --version
curl 7.68.0 (x86_64-pc-linux-gnu) libcurl/7.68.0 OpenSSL/1.1.1g zlib/1.2.11 brotli/1.0.7 libidn2/2.3.0 libpsl/0.21.0 (+libidn2/2.3.0) libssh2/1.8.0 nghttp2/1.40.0 librtmp/2.3
Release-Date: 2020-01-08

$ lsb_release -a 
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux bullseye/sid
Release:        testing
Codename:       bullseye

【问题讨论】:

    标签: ssl curl proxy upload zscaler


    【解决方案1】:

    两个选项中的第 1 步都将提取 Zscaler 证书。

    选项 1 直接卷曲

    1. 下载证书(所有证书都包含在一个文件中)
    2. 执行curl 命令传递您要使用的证书。
    # 1
    openssl s_client -showcerts \
    -connect jsonplaceholder.typicode.com:443 </dev/null 2>/dev/null \
    | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p'  > typicode.crt
    # 2
    curl --cacert typicode.crt -v \
    -d "userId=5&title=Hello World&body=Post body." \
     https://jsonplaceholder.typicode.com/posts
    

    选项 2(安装脚本)

    如果curl 命令由您无法控制的安装程序执行,请更新您的证书:

    1. 从服务器提取证书(使用 FQDN 或 IP 和 PORT,即:jsonplaceholder.typicode.com:443
    2. 将 XXX.crt 证书移至您的证书目录
    3. 更新证书
    4. 执行安装脚本
    # 1
    openssl s_client -showcerts \
    -connect jsonplaceholder.typicode.com:443 </dev/null 2>/dev/null \
    | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p'  > typicode.crt
    # 2
    sudo mv typicode.crt /usr/local/share/ca-certificates/
    # 3
    sudo update-ca-certificates
    # 4 execute your installer script
    

    奖金

    如果您只需要/想要获取 Zscaler 证书,请从以下地址获取 IP:https://ip.zscaler.com

    openssl s_client -showcerts -servername server -connect 165.225.216.33:443 >  </dev/null 2>/dev/null | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' | grep -m1 -B-1 -- '-----END CERTIFICATE-----'  > zscaler.crt
    

    更新(21 年 11 月 19 日):

    • 添加选项 1,当是直接curl 并且不需要安装证书。
    • 优化了提取证书的命令(创建文件)
    • 奖励:获得 Zscaler IP

    在 Zscaler 代理后面的 Ubuntu 20 和 18 上测试。

    没有证书

    有证书

    参考资料:

    【讨论】:

    • 感谢您的回答,但问题是 “我们公司正在使用 Zscaler 透明代理,它使用自己的证书拦截 SSL 请求”,这似乎不是已得到解决,因为它与获得普通站点证书完全不同。
    • 我遇到了同样的问题,我的公司正在使用 Zscaler,我执行了这些步骤,然后,我能够重新尝试安装(快照)并顺利完成。试试:openssl s_client -showcerts -servername server -connect 165.225.216.33:443 &gt; zscaler.pemip.zscaler.com获取IP
    • 如果您是从脚本安装,请查看curl 命令使用的地址,详细执行以获取失败的 IP 和端口,即:curl -vv https://get.helm.sh * Rebuilt URL to: https://get.helm.sh/ * Trying 152.195.19.97... * TCP_NODELAY set * Connected to get.helm.sh (152.195.19.97) port 443 (#0)
    • 最后一个选项... TEMPORAL 如果您信任正在使用的脚本并在执行安装后REMOVE文件stackoverflow.com/a/69933233/5078874跨度>
    • 谢谢阿德里安。您会将新的 cmets(最后一个除外)放入您的答案中,以使其成为一个完整的综合答案吗?即,为了 post 到 Zscaler 后面的 jsonplaceholder.typicode.com,有什么必要的步骤和他们的命令。谢谢。
    【解决方案2】:

    答案是“将该代理的证书添加到 CA 包”,感谢 Daniel Stenberg's answer。然后我想我应该填写其余部分。所以这是我尝试解决剩下的问题/问题--

    • 问:获得 Zscaler 证书的最简单方法是什么?
      答:来自here

    转到策略 > SSL 检查。在 SSL 拦截的中间根 证书 授权部分中,单击下载 Zscaler证书。导航到 ZscalerRootCerts。 zip文件并解压。

    • 您可以使用curl --cacert &lt;CA certificate&gt; 提供您公司的 CA 证书。
    • 或者您可以将您的公司 CA 证书添加到 /etc/pki/tls/certs/ 并在那里运行 make 以使其在系统范围内可用。

    【讨论】:

    • 有没有办法在 CentOS 7 上实现全局?运行 make 不会使其在系统范围内运行
    【解决方案3】:

    此错误 (SSL certificate problem) 表示 curl 用于验证服务器对等方的 CA 存储不包含证书,因此无法验证服务器。

    如果希望 curl 与终止 TLS 的透明代理一起工作,您必须将该代理的证书添加到 CA 捆绑包或完全忽略证书检查(我建议不要这样做)。

    TLS 的透明代理当然会使连接完全不可靠并破坏安全属性。

    【讨论】:

      猜你喜欢
      • 2020-09-20
      • 2021-08-07
      • 2020-09-18
      • 2021-06-02
      • 2020-09-14
      • 2014-02-06
      • 2011-11-04
      • 2021-12-14
      • 2017-11-21
      相关资源
      最近更新 更多