我遇到了一个我无法弄清楚如何调试的证书的奇怪问题。当我在一台特定服务器上的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容器内部发生的事情有什么关系?
我非常感谢对此有任何见解,尤其是我可以采取的任何调试步骤来更好地理解问题。
Docker使用iptables。
如果您设置了iptable规则,则可以将每个https请求定向到您自己的运行服务器。
例如,如果您在本地运行jenkins并使用iptables将443重定向到默认的8080端口,则所有到443端口的容器流量都将重定向到该本地jenkins服务器,该服务器将无法验证您的证书。在使用Jenkins构建我们的docker映像时,我们遇到了这个问题。我们的詹金斯使用iptables绕过以root身份运行詹金斯。