一尘不染

SSL证书验证在特定服务器上的Docker容器内失败

docker

我遇到了一个我无法弄清楚如何调试的证书的奇怪问题。当我在一台特定服务器上的docker容器内运行wget时,它无法验证证书。相同的wget在服务器计算机本身上(在docker外部)可以正常工作,并且可以在不同服务器上的同一docker容器内运行。

这是Docker容器的设置:

docker run --rm -ti debian:jessie bash
apt-get update
apt-get install wget
wget https://google.com

响应为:

converted 'https://google.com' (ANSI_X3.4-1968) -> 'https://google.com' (UTF-8)
--2016-06-22 14:22:02--  https://google.com/
Resolving google.com (google.com)... 216.58.217.142, 2607:f8b0:4004:807::200e
Connecting to google.com (google.com)|216.58.217.142|:443... connected.
ERROR: The certificate of 'google.com' is not trusted.
ERROR: The certificate of 'google.com' hasn't got a known issuer.
The certificate's owner does not match hostname 'google.com'

由于此过程在其他服务器上也可以使用,因此该问题似乎只能是该服务器本身上的某些证书​​问题。但是我必须感到困惑:为什么服务器本身上的证书与Docker容器内部发生的事情有什么关系?

我非常感谢对此有任何见解,尤其是我可以采取的任何调试步骤来更好地理解问题。


阅读 437

收藏
2020-06-17

共1个答案

一尘不染

Docker使用iptables。

如果您设置了iptable规则,则可以将每个https请求定向到您自己的运行服务器。

例如,如果您在本地运行jenkins并使用iptables将443重定向到默认的8080端口,则所有到443端口的容器流量都将重定向到该本地jenkins服务器,该服务器将无法验证您的证书。在使用Jenkins构建我们的docker映像时,我们遇到了这个问题。我们的詹金斯使用iptables绕过以root身份运行詹金斯。

2020-06-17