Docker容器中 curl 证书失败

hfyxw5xn  于 2023-01-16  发布在  Docker
关注(0)|答案(4)|浏览(306)

我在一个coporate proxy后面有一个Ubuntu 18.04 server
我设置了http_proxyhttps_proxy环境变量。
服务器正在运行Docker 19.03,该服务器还配置为使用http_proxy和https_poxy。
如果在容器中运行docker run -it ubuntu:18.04,我可以执行apt updateapt install curl -y
然后我就可以做类似curl www.google.com这样的事情。
但它不适用于https

root@1b6abfb4ff90:/# curl -v -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                             Dload  Upload   Total   Spent    Left  Speed
0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     
0*   Trying 10.30.88.14...
* TCP_NODELAY set
* Connected to xxx (10.30.88.14) port 8080 (#0)
* allocate connect buffer!
* Establish HTTP proxy tunnel to raw.githubusercontent.com:443
> CONNECT raw.githubusercontent.com:443 HTTP/1.1
> Host: raw.githubusercontent.com:443
> User-Agent: curl/7.58.0
> Proxy-Connection: Keep-Alive
> 
< HTTP/1.1 200 Connected
< 
* 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
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* CONNECT phase completed!
* CONNECT phase completed!
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [91 bytes data]
* TLSv1.2 (IN), TLS handshake, Certificate (11):
{ [2741 bytes data]
* TLSv1.2 (OUT), TLS alert, Server hello (2):
} [2 bytes data]
* SSL certificate problem: unable to get local issuer certificate
* stopped the pause stream!
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
* 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无法验证服务器的合法性,因此无法建立与服务器的安全连接。要了解有关此情况以及如何解决此问题的详细信息,请访问上述网页。
在容器外,它工作正常。我也在另一个没有代理的服务器上做了同样的尝试,它在容器内工作。
所以我想这是码头守护进程的配置问题。或者我错了...解决方案是什么?

q8l4jmvw

q8l4jmvw1#

您需要将SSL证书安装到Ubuntu容器中。例如,在运行示例上,您可以执行以下操作:

apt-get update
apt-get install ca-certificates

然后,您的所有HTTP连接都可以使用CA根证书的本地副本进行验证。
对于生产部署,此命令应位于Dockerfile中:

RUN \
  apt-get update && \
  apt-get install ca-certificates && \
  apt-get clean

编辑

你的代理可能具有不受信任的证书。你可以将其添加到捆绑包,或告诉curl不要使用curl --proxy-insecure检查代理的证书。
https://curl.se/docs/sslcerts.html开始:
从7.52.0版本开始,curl可以单独使用HTTPS连接到代理,而不是连接到服务器,这个TLS连接是单独处理的,所以不用--unsecure和--cacert来控制证书验证,而是使用--proxy-unsecure和--proxy-cacert。您要确保TLS连接和代理的信任可以与到服务器的TLS连接完全分开。

7jmck4yq

7jmck4yq2#

https://curl.haxx.se/ca/cacert.pem下载最新的cacert.pem,更好的方法是在dockerfile中添加一个步骤,作为构建步骤的一部分安装证书。
按照以下步骤安装
1.从https://curl.haxx.se/ca/cacert.pem下载文件
1.将文件重命名为cacert.crt
1.将文件复制到转到/usr/local/share/ca-certificates/
1.运行命令sudo update-ca-certificates

frebpwbc

frebpwbc3#

不要安装/etc/:/etc/到docker容器.在主机中的/etc/对docker容器无效.让docker容器使用它自己的/etc/.

3mpgtkmj

3mpgtkmj4#

如果您试图通过具有SSL拦截证书的计算机进行连接,或者有时使用病毒扫描程序进行连接,您可能会遇到此问题。
您可能需要添加证书请参阅此问题How to add trusted root CA to Docker alpine
我的修复步骤是为了帮助任何人:

  • 下载公司证书通过去通过这锁定图标在chrome并且输出这证书.确信你选择这根链到输出
  • docker cp corp-cert.crt /usr/local/share/ca-certificates/
  • update-ca-certificates容器内

相关问题