代码之家  ›  专栏  ›  技术社区  ›  stevendesu

自签名证书能否保护多个CNs/FQDN?

  •  0
  • stevendesu  · 技术社区  · 4 年前

    这是一个有点愚蠢的设置,但我现在看到的是:

    • 我在学Kubernetes
    • 我想将自定义代码推送到我的Kubernetes集群,这意味着代码必须作为Docker映像从 一些
    • 如果有必要的话,我愿意为Docker Hub付费(尽管我宁愿避免),但我担心将自定义代码放到第三方服务上。 Sudden rate limits , security breaches , sudden ToS changes 等等
    • 为此,我在Kubernetes集群中运行自己的Docker注册表
    • 我不想将Kubernetes节点上运行的Docker客户端配置为信任不安全(HTTP)Docker注册表。如果我选择从外部注册表中提取任何图像(例如 nginx 我可以从Docker Hub而不是本地托管)然后我不想在交换图像时受到MITM攻击
    • 最终
    • 在最终设置就绪之前,我将在本地计算机上构建映像,并希望将它们推送到注册表(从internet)
    • 因为我不打算从外部世界访问注册表(最终),所以我不能利用Let's Encrypt为它生成有效的证书(即使我向外部世界提供Docker注册表, I can't use Let's Encrypt, anyway

    我的计划是在将来学习这个榜样 this StackOverflow post :生成自签名证书,然后使用该证书启动Docker注册表。然后使用守护程序集使此证书在群集中的所有节点上都受信任。

    现在您已经完成了设置,这里是我的问题的关键:在我的集群中,我的Docker注册表可以通过一个简单的主机名(例如“Docker registry”)访问,但是在集群之外,我需要通过一个节点IP地址或指向一个节点或负载平衡器的域名来访问它。

    生成自签名证书时,要求我为证书提供CN/FQDN。我在“docker registry”中输入了我计划使用的内部主机名。然后,我尝试在本地访问我的注册表以将图像推送到其中:

    > docker pull ubuntu
    > docker tag ubuntu example.com:5000/my-ubuntu
    > docker push example.com:5000/my-ubuntu
    The push refers to repository [example.com:5000/my-ubuntu]
    Get https://example.com:5000/v2/: x509: certificate is valid for docker-registry, not example.com
    

    我可以为生成证书 example.com docker-registry 但是,如果我提供这样的外部域而不是内部主机名,我担心在配置服务或从集群中连接到注册表时会出现问题。

    二者都 example.com网站 docker注册表 . 如果没有,其他两个可接受的解决方案是:

    • 我可以告诉Docker客户机不要验证主机名,而是隐式信任证书吗?
    • 我能告诉码头工人登记处送两个中的一个吗 基于用于访问它的主机名的证书?

    如果这三个选项都不可能,那么我可以放弃从本地机器推送图像,开始在集群中构建图像的过程——但我希望推迟到以后。我现在学到了很多,尽量避免被一些无关紧要的事情分心。

    1 回复  |  直到 4 年前
        1
  •  3
  •   Rory McCune    4 年前

    解决问题的最简单方法可能是使用Docker的不安全注册表功能。你在文章中提到的担心(这会让你以后面临安全风险)可能不适用,因为该功能通过指定特定的IP地址或主机名来工作。

    {
        "insecure-registries" : [ "10.10.10.10:5000" ]
    }
    

    Docker守护进程在没有TLS的情况下访问的唯一IP地址是位于该主机和端口号的IP地址。

    如果不想这样做,则需要获得一个可信的TLS证书。您提到的每个证书有多个名称的问题通常由 Subject Alternative Name cert中的字段(实际上Kubernetes经常使用这个特性)。