检查 TLS 连接时出错:检查和/或重新生成证书时出错



重新启动Windows后,我无法连接到在Oracle Virtual Box中运行的Docker机器。当我启动 Docker 快速入门终端时,一切看起来都很好,它运行正常,它给了我这条消息:

docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com

但是当我这样做时:

$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL   SWARM   DOCKER   ERRORS
default   -        virtualbox   Timeout

和:

λ docker images
An error occurred trying to connect: Get http://localhost:2375/v1.21/images/json: dial tcp 127.0.0.1:2375: ConnectEx tcp: No connection could be made because the target machine actively refused it.

同样,当我尝试重新初始化我的环境时,我得到:

λ docker-machine env default
Error checking TLS connection: Error checking and/or regenerating the certs: There was an error validating certificates for host "192.168.99.100:2376": dial tcp 192.168.99.100:2376: i/o timeout
You can attempt to regenerate them using 'docker-machine regenerate-certs [name]'.
Be advised that this will trigger a Docker daemon restart which will stop running containers.

顺便说一句,再生证书也无济于事。知道吗?

谢谢。

请尝试通过以下方式手动重新生成证书:

docker-machine --debug regenerate-certs -f default

并检查是否有任何要修复的错误,然后重试:

docker-machine --debug env default

如果在 ssh 上失败,请将该命令复制并粘贴到终端中,通过添加额外的-vv来查看问题所在。

如果您有:

debug1:连接到地址 127.0.0.1 端口 64368:连接被拒绝

然后你的机器没有运行(通过docker-machine ls检查(,所以尝试:

docker-machine start

然后尝试通过以下方式对它进行ssh处理:

docker-machine -D ssh default

经过一些研究,我发现以下解决方法现在可以解决问题:

  1. 开放网络和共享中心

  2. 单击更改适配器设置

  3. 查看是否有任何已启用的适配器,例如 VPN 或 VM Ware 网络适配器。

  4. 尝试
  5. 禁用它们并尝试再次连接到您的容器

  6. 如果在禁用其他适配器时它不起作用,请重新启动您的PC - 就我而言,这对我有用。

对我有用的是来自 docker 机器存储库的这个答案:

docker-machine regenerate-certs --client-certs [name]

基本上,过期的是客户端证书。我从 docker 机器收到的错误消息与您的类似(即,没有迹象表明需要重新生成的是客户端证书(。

我这样做修复它:

  • 从我的VirtualBox中删除了所有仅主机接口(VirtualBox →首选项→网络→仅主机网络(。
  • rmdir.exe --ignore-fail-on-non-empty ~/.docker/
  • docker-machine start
  • docker-machine env
  • eval $("C:Program FilesDocker Toolboxdocker-machine.exe" env default)(也在我的.bash_profile末尾添加(。
  • docker run hello-world ←现在工作

在这篇文章中受到启发。

这是对我有用的东西。第一步类似于Hazhir提出的,然后是重新生成证书。

  1. 打开"网络和共享中心"。
  2. 单击更改适配器设置。
  3. 禁用所有活动的 VMWare 网络适配器。通常有解释"VirtualBox 仅主机以太网适配器"。
  4. 通过运行 docker-machine start 连接到容器。
  5. 运行docker-machine env .如果你像我一样,那么你会收到以下错误:

检查 TLS 连接时出错:检查和/或重新生成 证书:验证主机的证书时出错 "192.168.99.100:2376":x509:证书对 192.168.99.101 有效, 不是 192.168.99.100

这很好。现在我们需要做的就是运行

docker-machine regenerate-certs -f default

然后用docker-machine env再次测试。如果您得到:

SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://192.168.99.100:2376
SET DOCKER_CERT_PATH=C:UsersJay.dockermachinemachinesdefault
SET DOCKER_MACHINE_NAME=default
REM Run this command to configure your shell:
REM     FOR /f "tokens=*" %i IN ('docker-machine env') DO %i

然后你就准备好了。就我而言,我需要通过运行 Docker 快速入门终端来启动虚拟机。

我也有这个问题。执行docker-machine regenerate-certs <vm-name>不能解决问题。我在谷歌上搜索错误信息,并在下面找到解决方案。

  • 在终端中执行sudo ifconfig vboxnet0 up
  • 显示码头工人机器状态:docker-machine ls
  • 现在STATEURL都没问题。

但是重新启动系统此问题仍然存在。

我找到的 GitHub 问题链接在这里。

VirtualBox 5.1.24中似乎有一个错误。

只需启动 docker 机器,然后重新生成证书

docker-machine start <machine-name>
docker-machine regenerate-certs <machine-name>

它对我来说就像一个魅力。

这里的答案都没有帮助我。当我想使用 eval $(docker-machine env 默认值(激活虚拟机的外壳时,我的问题发生了。

然后它试图访问已关闭的端口 2376,因此我必须通过 ssh 进入 VM 的外壳并激活以下 UFW 规则:

sudo ufw allow 2376

我确保能够连接到我的 docker 机器的方法是为它们分配一个固定 IP(并且只重新生成一次证书((无需重新启动(

在那之后,docker-machine ls总是工作。

我目前的脚本:
(将%PRGS%dmlatest替换为计算机上docker-machine.exe所在的路径(
(确保PATH包含最新的/path/to/git/usr/bin,以便像 ssh 这样的命令可用(

> more dmvbf.bat
@echo off
setlocal enabledelayedexpansion
set machine=%1
if "%machine%" == "" (
        echo dmvbf expects a machine name
        exit /b 1
)
set ipx=%2
if "%ipx%" == "" (
        echo dmvbf x missing ^(for 192.168.x.y^)
        exit /b 2
)
set ipy=%3
if "%ipy%" == "" (
        echo dmvbf y missing ^(for 192.168.x.y^)
        exit /b 3
)
%PRGS%dmlatestdocker-machine.exe ssh %machine% "sudo sh -c 'echo "kill $(more /var/run/udhcpc.eth1.pid)" | sudo tee /var/lib/boot2docker/bootsync.sh >/dev/null'"
%PRGS%dmlatestdocker-machine ssh %machine% "sudo sh -c 'echo "ifconfig eth1 192.168.%ipx%.%ipy% netmask 255.255.255.0 broadcast 192.168.%ipx%.255 up" | sudo tee -a /var/lib/boot2docker/bootsync.sh >/dev/null'"
%PRGS%dmlatestdocker-machine ssh %machine% "sudo chmod 755 /var/lib/boot2docker/bootsync.sh"
%PRGS%dmlatestdocker-machine ssh %machine% "sudo cat /var/run/udhcpc.eth1.pid | xargs sudo kill"
%PRGS%dmlatestdocker-machine ssh %machine% "sudo ifconfig eth1 192.168.%ipx%.%ipy% netmask 255.255.255.0 broadcast 192.168.%ipx%.255 up"

例如:

dmvbf default 99 100
docker-machine regenerate-certs -f default

这会将192.168.99.100分配给 docker 计算机"default",并重新生成一次证书。
然后每次调用docker-machine ls时,它都会为"default"显示相同的IP。

尝试以下方法/解决方法:

  • 首先确保在 $yourhome/.docker/machine/certs/文件夹下有 ca.pem、cert.pem、key.pem、ca-key.pem,对于这四个丢失的 *.pem 文件,您可以从其他地方复制它们,也可以自己创建它们(这四个 PEM 文件在开始时肯定不正确(
  • 确保 ENV 在 bash_profile 中设置正确,例如:导出DOCKER_HOST=TCP://192.168.99.100:2376导出DOCKER_MACHINE_NAME=默认导出DOCKER_TLS_VERIFY=1export DOCKER_CERT_PATH=/Users/johnwang/.docker/machine/machines/default
  • 重新运行 cmd:docker-machine regenerate-certs 默认值(也许在运行此程序之前,您需要重新打开 docker 终端(在 Mac 上的 docker 工具箱上尝试过,它可以工作。
  • 最后是结果的一些日志:检查 TLS 连接时出错: 检查和/或重新生成证书时出错: 验证主机"192.168.99.100:2376"的证书时出错: x509:由未知颁发机构签名的证书您可以尝试使用"docker-machine regenerate-certs [name]"重新生成它们。请注意,这将触发 Docker 守护程序重新启动,这可能会停止运行的容器。......johns-MacBook-Pro:certs johnwang$ docker-machine regenerate-certs default重新生成 TLS 计算机证书?警告:这是不可逆的。(年/年(: 年重新生成 TLS 证书正在等待 SSH 可用...正在检测预配程序...正在将证书复制到本地计算机目录...正在将证书复制到远程计算机...在远程守护程序上设置 Docker 配置...johns-MacBook-Pro:certs johnwang$ docker-machine ls命名活动驱动程序状态 URL 群 DOCKER 错误默认 - 虚拟框 运行 tcp://192.168.99.100:2376 v17.03.1-ce

希望对你有帮助另请参阅我的回复:https://github.com/docker/machine/issues/2808

就我而言,是我的FortiClient导致了这个问题。禁用它后docker-machine env default再次正常工作。我建议您检查系统中是否正在运行任何防病毒程序。

对我来说,正在运行

docker-machine --debug regenerate-certs -f name_of_your_vm

工作得很好。

docker-machine version 0.16.1
virtualBox 6.0

此外,Docker还配置为使用IP 为192.168.99.100的默认计算机

我遇到了同样的错误。我通过在网络防火墙中打开 tcp 端口 2376 来修复它。

我的问题的解决方案从这里开始:https://github.com/docker/machine/issues/3845#issuecomment-271935924

报价:

如果您第一次安装 docker 机器,那么您没有托管将用于生成客户端的自签名 CA证书和与您生成的计算机一样多的服务器证书后来。当您尝试创建计算机时,将生成该 CA,如果尚未创建 CA。因此,如果您尝试生成多个服务器并行(通过脚本(,然后您将生成尽可能多的自签名(根(CA 作为 docker create命令,所有这些都是写在似乎弄乱的同一位置环境,例如将不同的 ca.pem 分散到远程机器与最终版本匹配,导致 cert.pem(主机标识(由已不存在的前 ca.pem 签署......什么的其他异常情况。

要修复它,首先您需要删除现有的自签名 CA。这可以通过删除文件夹来完成 ~/.docker/machine/certs(注意:请注意,这将强制创建新的自签名 CA 供 docker 机器使用,并将产生您的现有计算机无法连接到守护程序(。这将使您的码头工人机器再次生成有效证书。然后,对于我的用例我正在创建前台的第一台机器和所有其余的都是并行完成的。这将导致创建一个根自签名 CA 隔离,然后将用于进一步docker-machine create command。它就像一个魅力!

我之所以能够ssh到主机,是因为有一个用于 SSH 生成的不同密钥对为每个主机生成,而不是被这个咬了一口。

总而言之,这就是我最终所做的:

  1. 找出码头工人机器正在运行的命令是什么。我把它与 gitlab-runner 一起使用,所以我必须在调试模式下运行 gitlab-runner 以查看它在 docker 机器上运行的命令。

  2. 然后停止 Gitlab-runner:gitlab-runner stop

  3. 然后删除证书:rm -rf ~/.docker/machine/certs

  4. 然后运行单个命令(从步骤 #1 开始(重新创建证书(请记住 - 这不起作用的原因是因为它尝试多次创建它(

  5. 然后重新运行 Gitlab-runner: gitlab-runner start

为我工作!

对于在 2021 年使用brew的读者,在您以某种方式升级virtualbox桶之后

  1. 系统偏好设置...> 安全和隐私>(用手指解锁(Allow.
    <<您的计算机应该重新启动>。
  2. docker-machine restart default .

通过安装 Docker DesktopMacOS 中解决了此问题

  1. brew uninstall docker
  2. brew uninstall docker-machine
  3. 然后下载适用于 Mac 的 Docker 桌面 https://docs.docker.com/desktop/mac/install/

最新更新