Docker Swarm:守护程序的错误响应:验证根CA证书时出错:x509:证书已过期或尚未生效。

4

操作系统: CentOS 7虚拟机

Docker最新版本

执行的命令:

   1) docker swarm init
   2) docker swarm join --token SWMTKN-1-3iqtmbz55yvhxkahe2ncs7d9ebxzlzmw1pwhqzvmcemiolef63-3muc4qjs3mbvh53t8ktzzmb22 192.168.10.108:2377 
    Error: Error response from daemon: error while validating Root CA Certificate: x509: certificate has expired or is not yet valid

如您所见,swarm join 给出了这个错误。这个错误是由什么原因引起的,它来自哪里?

谢谢
Aditya


你是在同一台机器上执行这两个命令还是在不同的机器上?你使用了代理吗? - Tarun Lalwani
@Tarun Lalwani 两者在不同的机器上执行。 - CK5
你在使用任何代理吗? - Tarun Lalwani
尽管包括了"HTTP_PROXY"和"NO_PROXY",仍然遇到了相同的问题。 - user1907700
@Tarun Lalwani 不行,没有代理! - CK5
1
将两台机器的时间修正为同一时间。 - Emdadul Sawon
6个回答

11

由于Swarm init生成的CA证书具有未来日期的开始日期,可能是由于ntp延迟引起的相似问题。

可以使用以下命令获取CA证书信息:

docker swarm ca | openssl x509 -noout -text

输出的结果大致如下:

Certificate:
Data:
    Version: 3 (0x2)
    Serial Number:
        ...
Signature Algorithm: ecdsa-with-SHA256
    Issuer: CN=swarm-ca
    Validity
        Not Before: Oct 24 20:25:00 2018 GMT
        Not After : Oct 19 20:25:00 2038 GMT
    Subject: CN=swarm-ca
    Subject Public Key Info:
        Public Key Algorithm: id-ecPublicKey
            Public-Key: (256 bit)
            pub:
                ...
                ...
                ...
                ...
            ASN1 OID: prime256v1
            NIST CURVE: P-256
    X509v3 extensions:
        X509v3 Key Usage: critical
            Certificate Sign, CRL Sign
        X509v3 Basic Constraints: critical
            CA:TRUE
        X509v3 Subject Key Identifier:
            ...
Signature Algorithm: ecdsa-with-SHA256
     ...
     ...
     ...
     ...

您可以看到有效期范围是从Oct 24 20:25:00 2018 GMT到Oct 19 20:25:00 2038 GMT。如果试图加入群集的机器不在该时间间隔内,则会因此错误而失败。


5

当节点的时间未同步时,会出现此错误。在初始群集后。

docker swarm init

您可以使用以下命令查看Swarm证书的有效期限。
docker swarm ca | openssl x509 -noout -text

您的节点时间必须在以下时间范围内:

有效性
不早于:Feb 20 10:21:00 2019 GMT
不晚于:Feb 15 10:21:00 2039 GMT

对于在Linux中设置节点时间,可以使用“timedatectl”命令

对于自动同步时间,您可以在每个节点上使用以下命令

timedatectl set-timezone asia/Tehran
timedatectl set-ntp on

你可以使用以下代码展示所有的时区:

timedatectl list-timezones

1

对我来说,只需删除证书并重新启动服务即可解决问题。


0

事实上,在运行Docker节点的虚拟机之间,日期和时间没有同步:

以下命令帮助我解决了这个问题:

systemctl stop ntpd ;  ntpdate *server* ; systemctl start ntpd

文档所述:

ntpdate通过轮询作为服务器参数给出的网络时间协议(NTP)服务器来设置本地日期和时间,以确定正确的时间


0

我通过在两台机器上设置相同的日期来解决了这个问题。


0

我按照以下步骤操作,成功解决了问题:

  • 更改时区(根据控制节点的时区可以更改GMT):

    timedatectl set-timezone GMT

  • 更改节点机器中的日期格式:

    date --set "Tue 2021-12-21 17:18:07 GMT"

提示:通过运行此命令从Swarm主节点获取日期格式。

docker swarm ca | openssl x509 -noout -text | grep "Not Before"

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