AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1164766
Accepted
piyush sachdeva
piyush sachdeva
Asked: 2024-08-01 11:15:27 +0800 CST2024-08-01 11:15:27 +0800 CST 2024-08-01 11:15:27 +0800 CST

AWS EC2 上的 Kubernetes - 由未知机构签名的私有注册表证书

  • 772
该问题已从 Stack Overflow迁移,因为它可以在 Server Fault 上得到解答。 已于 38 分钟前迁移 。

问题摘要

我有一个 Kubernetes 集群 1.30,运行在 3 个 AWS EC2 服务器、1 个主节点和 2 个工作节点上。我正在尝试使用registry:2.8.2CNCF 分发项目的映像部署私有容器注册表。我已按照下面列出的步骤操作,但在尝试执行 docker 登录注册表时收到错误“x509 证书由未知机构签名”。

注意:我正在使用自签名证书。

重现步骤

  1. 创建自签名证书和用户身份验证。TLS 证书使用 OpenSSL:

    mkdir registry
    cd registry
    mkdir certs
    mkdir auth
    
    openssl req -x509 -newkey rsa:4096 -days 365 -nodes -sha256 -keyout certs/tls.key -out certs/tls.crt -subj "/CN=my-registry" -addext "subjectAltName = DNS:my-registry"
    
  2. 用于htpasswd添加注册表访问的用户身份验证。私有注册表的凭据为myuser/mypasswd:

    docker run --entrypoint htpasswd httpd:2 -Bbn myuser mypasswd > auth/htpasswd
    
  3. 创建一个 secret 来挂载证书(secret type tls):

    kubectl create secret tls certs-secret --cert=/home/ubuntu/day42/registry/certs/tls.crt --key=/home/ubuntu/day42/registry/certs/tls.key
    
  4. 创建身份验证的秘密:

    kubectl create secret generic auth-secret --from-file=/home/ubuntu/day42/registry/auth/htpasswd
    
  5. 创建本地目录并应用 PV PVC。

  6. 创建注册表 pod。

apiVersion: v1
kind: Pod
metadata:
  name: docker-registry-pod
  labels:
    app: registry
spec:
  containers:
  - name: registry
    image: registry:2.8.2
    volumeMounts:
    - name: repo-vol
      mountPath: "/var/lib/registry"
    - name: certs-vol
      mountPath: "/certs"
      readOnly: true
    - name: auth-vol
      mountPath: "/auth"
      readOnly: true
    env:
    - name: REGISTRY_AUTH
      value: "htpasswd"
    - name: REGISTRY_AUTH_HTPASSWD_REALM
      value: "Registry Realm"
    - name: REGISTRY_AUTH_HTPASSWD_PATH
      value: "/auth/htpasswd"
    - name: REGISTRY_HTTP_TLS_CERTIFICATE
      value: "/certs/tls.crt"
    - name: REGISTRY_HTTP_TLS_KEY
      value: "/certs/tls.key"
  volumes:
  - name: repo-vol
    persistentVolumeClaim:
      claimName: registry-pvc
  - name: certs-vol
    secret:
      secretName: certs-secret
  - name: auth-vol
    secret:
      secretName: auth-secret
  1. 创建服务舱。

  2. 导出环境变量:

    export REGISTRY_NAME="my-registry"
    Master-->export REGISTRY_IP="10.100.175.12"
    # (Above IP is the NodePort service IP)
    
  3. /etc/hosts在所有节点中添加以下条目:

    10.100.175.12 my-registry
    
  4. 复制tls.crt到/usr/local/share/ca-certificates所有节点并运行以下命令:

    sudo update-ca-certificates 
    
  5. 尝试登录注册表:

    docker login my-registry:5000 -u myuser -p mypasswd
    

错误详细信息

Error response from daemon: Get "https://my-registry:5000/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority

输出crictl info

crictl info |grep -i tls
    "enableTLSStreaming": false,
      "tlsCertFile": "",
      "tlsKeyFile": ""
docker
  • 2 2 个回答
  • 4 Views

2 个回答

  • Voted
  1. Imran Premnawaz
    2024-08-01T18:45:00+08:002024-08-01T18:45:00+08:00

    对于 SSL 之类的证书,您需要将整个证书链添加到您使用 nginx 运行注册表的证书文件中。许多操作系统不信任中间 CA ,只信任根 CA,因此您需要在主机证书和操作系统信任的根 CA之间填写缺失的步骤。

    在您收到证书的电子邮件中,您还应该找到中间 CA 和根 CA 的链接。打开docker-registry.crt文件,滚动到底部,并附加中间 CA,最后附加 PositiveSSL 链的根 CA 证书。完成后,重新启动 nginx。现在您应该可以开始了。

    注意:如果您拥有域名,您可以使用 Let's Encrypt免费获取可信证书。

    • 0
  2. Best Answer
    piyush sachdeva
    2024-08-01T19:14:02+08:002024-08-01T19:14:02+08:00

    呼!花了三天时间解决这个问题后,我终于搞清楚了。

    以下是我为解决该问题所采取的步骤:

    确保所有节点都信任自签名证书:

    • 验证tls.crt已复制到/usr/local/share/ca-certificates所有节点
    • sudo update-ca-certificates在每个节点上运行。

    配置Docker以信任自签名证书:

    需要明确配置 Docker 以信任您的自签名证书。您必须将 复制tls.crt到 Docker 的受信任证书目录。

        sudo mkdir -p /etc/docker/certs.d/my-registry:5000
        sudo cp /path/to/your/tls.crt /etc/docker/certs.d/my- 
        registry:5000/ca.crt
        
    

    注意:将 /path/to/your/tls.crt 替换为您的 tls.crt 文件的路径。

    再次运行 docker login

    docker login https://my-registry:5000 -u myuser -p mypasswd
    WARNING! Using --password via the CLI is insecure. Use --password-stdin.
    WARNING! Your password will be stored unencrypted in /home/ubuntu/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    
    Login Succeeded
    
    • 0

相关问题

  • 当你让一个进程监听 0.0.0.0 而不是 127.0.0.1 时,为什么 docker 工作仍然很困惑

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve