linux - 无法将 docker 镜像推/拉到经过证书身份验证的私有(private)注册表? (仅适用于 WSL,远程错误 : tls: alert(116))

标签 linux docker ssl windows-subsystem-for-linux docker-registry

我认为这是一个非常奇怪和有趣的问题。
我有一个客户端证书认证的 docker 注册表设置,宽度 apache 的帮助。我已根据 this 将必要的证书文件放入相应的文件夹中文章。
Docker pull/push 给出了这个错误信息:

Error response from daemon: Get https://***:9443/v2/: remote error: tls: alert(116)


我认为我的证书文件是正确的并放在适当的位置,因为 docker pull 和 push 在 linux 机器上正常工作,我只能在 WSL 系统上重现这个问题。
此命令正常工作,并给出了我从 linux 机器推送的图像名称。

curl --cacert ca.crt --key client.key --cert client.cert " https://***:9443/v2/_catalog"


我认为问题在于我的证书文件的宽度。
我也试过运行这个命令:

docker --debug --tlsverify --tlscacert /home/user/.docker/certs.d/***:9443/ca.crt --tlscert /home/user/.docker/certs.d/***:9443/client.cert --tlskey /home/user/.docker/certs.d/***:9443/client.key pull ***:9443/hello-world-test


输出是这样的,我无法理解。当然 docker daemon 正在运行:

Using default tag: latest DEBU[0000] FIXME: Got an status-code for which error does not match any expected type!!!: -1 module=api status_code=-1 Cannot connect to the Docker daemon at tcp://localhost:2376. Is the docker daemon running?


docker 版本:
  • Docker 版本 20.10.5,构建 55c4c88

  • 安装的linux:
    linux version
    docker -compose.yml
    services:
      apache:
      image: "httpd:2.4"
      ports:
        - 9443:9443
      links:
        - registry:registry
      volumes:
        - /opt/docker-registry-certauth/auth:/usr/local/apache2/conf:z
        - /opt/docker-registry-certauth/log:/var/log/apache:z
    
    registry:
      image: registry:2
      ports:
        - 127.0.0.1:5000:5000
      volumes:
        - /opt/docker-registry-certauth/data:/var/lib/registry:z
    
    如果有人能给我一些如何克服这个问题的建议,或者有人知道可能是什么问题,我将不胜感激。

    最佳答案

    经过大量研究后,我无法在 WSL2 系统上解决这个问题。但我想出了一个解决方法,不是最好的解决方案,但它有效。
    我写了一个 bash 脚本,我暂时使用 docker dind 图像从经过验证的私有(private)客户端注册表中提取图像。

    docker run --rm --privileged --name=win-dind -v $(pwd):/var/tmp -d docker:20.10-dind
    
    在 dind images 运行后,我们将证书文件复制到适当的位置。
    dindImgId=$(docker ps -qf "name=win-dind")
    
    docker exec -it $dindImgId mkdir -p /etc/docker/certs.d/$registryName/
    docker cp ./cert/setup/ca.crt $dindImgId:/etc/docker/certs.d/$registryName/ca.crt
    docker cp ./cert/setup/client.key $dindImgId:/etc/docker/certs.d/$registryName/client.key
    docker cp ./cert/setup/client.cert $dindImgId:/etc/docker/certs.d/$registryName/client.cert
    // Download the necessary images...
    
    并且为了确保在我们启动 bash 脚本时不要一直下载每个图像,我们可以尝试在注册表中找到我们的本地镜像 ID 来解决它。
    download() {
    
      currImageId=$(docker images --no-trunc --quiet $registryName/$modulName:$imageTag)
      if [[ $currImageId != "" ]]
      then
        tmp=$(curl -s --cacert ./cert/setup/ca.crt --key ./cert/setup/client.key --cert ./cert/setup/client.cert -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -k -X GET https://$registryName/v2/$modulName/manifests/$imageTag | grep -c $currImageId)
      if [[ $tmp = 0 ]]
      then
        docker exec -it $dindImgId docker pull $registryName/$modulName:$imageTag
        updatedImages+="$registryName/$modulName:$imageTag "
      else
        echo "Not available newer version from $modulName modul."
      fi
    
      else
        docker exec -it $dindImgId docker pull $registryName/$modulName:$imageTag
        updatedImages+="$registryName/$modulName:$imageTag "
      fi
    }
    
    最后,我将图像保存到一个 tar 文件中,并将其存储在/var/tmp 中。由于卷它会立即出现在主机上,而我们只需要加载它之后。
    docker exec -it $dindImgId docker save --output /var/tmp/pmsthf-images.tar $updatedImage
    docker load < images.tar
    

    关于linux - 无法将 docker 镜像推/拉到经过证书身份验证的私有(private)注册表? (仅适用于 WSL,远程错误 : tls: alert(116)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67968486/

    相关文章:

    docker - 如何在Docker中以非root用户身份在Docker中运行Docker命令?

    java - 代理 JSSE/SSLContext/SSLEngine?

    javascript - 通过 ssl 调用 Javascript 函数

    linux - 使用 unix 脚本向逗号分隔文件添加空/零值

    c - 如何编译这个 Linux 程序?

    Linux postfix/dovecot 554 中继访问被拒绝

    .net - 通过 Docker 运行 .Net Core 应用程序时无法找到 .XML 文件

    docker - 如何在每个 Pull Request 上通过 Docker 启动应用程序?

    javascript - 第一个 XMLHttpRequest 失败但仅在 IE9 上

    python - 除了标准库中包含的工具之外,Linux 上的 Python 还有哪些分析工具?