如何在docker-machine中修复过期的客户端证书

25

执行docker-machine ls命令时,我得到了如下错误:Unable to query docker version: Get https://x.x.x.x:2376/v1.15/version: x509: certificate has expired or is not yet valid。对于每个机器都是这个错误。

最近我没有做过任何事情。在Stack Overflow上搜索后,我尝试了一些常见的罪魁祸首,如VPN、病毒、怪异的时钟问题等。但这些并不适用。如何修复它们,使它们能够再次通过docker-machine界面使用呢?

我使用的是Docker for Mac,版本号为17.12.0-ce-49。

3个回答

41

更新 - 正如我于2018年2月14日所评论的那样,这现在是docker-machine的一部分。
尝试: docker-machine regenerate-certs --client-certs

下面是历史回答:


首先,docker-machine regenerate-certs不会重新生成客户端证书。

经过与openssl的交互,我发现实际上是客户端证书已过期。验证:

openssl x509 -in ~/.docker/machine/certs/cert.pem -text | grep "Not After"

我尝试使用相同的ca.pem在原地重新创建证书,但没有成功(对我来说)。 我猜测如果再多花一点时间和尝试,它最终会成功。

最终起作用的是备份整个目录,创建一个虚拟的临时机器(强制docker-machine创建新证书),移动配置、ssh密钥和服务器证书(不要移动客户端证书),然后为每台机器发出一次重新生成命令。注意,这会产生中断并且很痛苦。就像警告显示的那样,docker-machine regenerate-certs将重新启动目标机器上的docker。虽然为我而言已经太晚了,但我希望看到更好的答案。

该过程大致如下:

#!/bin/bash

cd ~/.docker || exit
cp -R machine machine.bak
rm -rf machine
docker-machine create deleteme
docker-machine rm -rf deleteme
cd machine/machines || exit

for m in $(~/.docker/machine.bak/machines)
do
    cp -R "../../machine.bak/machines/$m" .
    rm "$m/cert.pem"
    rm "$m/key.pem"
    cp certs/cert.pem "$m"
    cp certs/key.pem "$m"
    docker-machine regenerate-certs -f
done

2
今天在 docker-machine 的主分支中已经修复了这个问题,当发布版本时,可以使用 docker-machine --regenerate-certs --client-certs 命令来解决。详情请见:https://github.com/docker/machine/issues/4397 - rubyisbeautiful
1
为什么要使用cp和rm,如果你可以直接使用mv呢? :) - Oduvan
1
哈,我不记得为什么要那样做了。也许一开始是想以安全的方式来完成它?或者可能有一个很好的理由。不管怎样,我很高兴它有所帮助! - rubyisbeautiful
2
这个绝妙的建议对我起了作用!如果错误信息能够提供正确的建议就好了:“检查TLS连接时出错:检查和/或重新生成证书时出错:验证主机“192.168.99.100:2376”的证书时出现错误:x509:证书已过期或尚未生效。您可以尝试使用'docker-machine regenerate-certs [name]'来重新生成它们。” - qu1j0t3

22

尝试:

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

--client-certs 很重要。

注意:

可以通过运行以下命令来检查有效性:

openssl x509 -in ~/.docker/machine/certs/cert.pem -text -noout | less

结果大概是这样:

 Certificate:
     Data:
     ...
     Signature Algorithm: sha256WithRSAEncryption
         ...
         Validity
             Not Before: Mar 12 09:03:00 2018 GMT
             Not After : Feb 24 09:03:00 2021 GMT
     ...

1
我刚刚看到这也在上面被评论了。我仍然相信有效性检查增加了价值。 - skytteren

0

我无法通过上述方案解决我的问题。所以我只好删除我的设备及其相应的证书文件夹,然后成功创建了我的设备:

docker-machine rm -y $(docker-machine ls -q)
rm -rf ~/.docker/machine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接