使用自签名证书配置本地注册表

mcs*_*sim 5 openssl docker docker-registry

我想用我将在本地网络中使用的自签名证书配置本地docker注册表。我正在按照docker manual [1、2]的说明进行操作,但是仍然遇到错误。

确切地说,我的问题如下。我在本地注册表计算机上创建一个自签名证书:

openssl req \                                 
  -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
  -x509 -days 365 -out certs/domain.crt \
  -subj "/C=US/ST=Oregon/L=Portland/O=Company Name/OU=Org/CN=openmpi-dockerregistry.local"
Run Code Online (Sandbox Code Playgroud)

我将此证书放入/etc/docker/certs.d/openmpi-dockerregistry:443/ca.crt每台本地计算机上。

然后,我启动注册表并在其中推送图像。由于我的网络中未配置DNS,因此只需在中输入即可/etc/hosts

接下来,我尝试将图像拉到本地计算机上,但是此操作失败:

$ docker run -it openmpi-dockerregistry.local:443/hello-world
Unable to find image 'openmpi-dockerregistry.local:443/hello-world:latest' locally
docker: Error response from daemon: Get https://openmpi-dockerregistry.local:443/v2/: x509: certificate is not valid for any names, but wanted to match openmpi-dockerregistry.local.
See 'docker run --help'.
Run Code Online (Sandbox Code Playgroud)

我对消息“ x509:证书对任何名称均无效”非常怀疑,这听起来我没有正确指定CN,但是读取证书则表明相反(完整输出):

 $ openssl x509 -text -noout -in certs/domain.crt
 ....
    Signature Algorithm: sha256WithRSAEncryption
         Issuer: C = US, ST = Oregon, L = Portland, O = Company Name, OU = Org, CN = openmpi-dockerregistry.local
 ....
Run Code Online (Sandbox Code Playgroud)

我尝试过的另一种选择是直接通过IP访问寄存器。我遵循了手册[3],并在证书中添加了IP SAN。另外,我还设置了CN = *。这样,生成的证书现在包含以下内容(完整内容):

        X509v3 extensions:
            X509v3 Subject Alternative Name: 
               IP Address:<ip address>
Run Code Online (Sandbox Code Playgroud)

但是现在当我尝试拉出图像时,出现以下错误消息:

$ docker run -it  <ip>:443/hello-world
Unable to find image '<ip>:443/hello-world:latest' locally
docker: Error response from daemon: Get https://<ip>:443/v2/: x509: cannot validate certificate for <ip> because it doesn't contain any IP SANs.
See 'docker run --help'
Run Code Online (Sandbox Code Playgroud)

虽然该文件/etc/docker/certs.d/<ip>:443/ca.crt包含IP地址。

您能帮我找到一种从本地注册表中提取图像的方法吗?

更新资料

如何启动Docker注册表?

$ docker run -d \
   -v `pwd`/certs:/certs \
   -e REGISTRY_HTTP_ADDR=0.0.0.0:$REGISTRY_PORT \
   -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
   -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
   -p $REGISTRY_PORT:$REGISTRY_PORT \
   --restart=always \
   --name registry \
   registry:2
Run Code Online (Sandbox Code Playgroud)
  1. https://docs.docker.com/registry/insecure/#use-self-signed-certificates
  2. https://docs.docker.com/registry/deploying/#run-an-externally-accessible-registry
  3. https://bowerstudios.com/node/1007

Ste*_*ano 5

我认为问题在于您没有将证书和密钥复制到该/etc/docker/certs.d/文件夹中。

该文件夹应如下所示:

/etc/docker/certs.d/
??? openmpi-dockerregistry.local:443
   ??? client.cert
   ??? client.key
   ??? ca.crt
Run Code Online (Sandbox Code Playgroud)

就我而言,我没有ca.crt,并且工作正常。

参考:https : //docs.docker.com/engine/security/certificates/


我在计算机上实现了安装程序,在/etc/docker/certs.d文件夹中复制了domain.key和domain.crt(并重命名了它们)后,一切工作正常。唯一的区别是我用作openmpi-dockerregistry域而不是openmpi-dockerregistry.local