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

时间:2017-11-11 13:16:57

标签: docker openssl docker-registry

我想配置一个本地docker注册表,其中包含我将在本地网络中使用的自签名证书。我遵循了泊坞手册[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"

我在每台本地计算机上将此证书放入/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'.

我非常怀疑消息" x509:证书对任何名称都无效",这听起来我没有正确指定CN,但是阅读证书表明相反({{3 }}):

 $ 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
 ....

我尝试的另一个选项是通过IP直接访问寄存器。我按照手册[3]并将IP SAN添加到证书中。另外我还设置了CN = *。因此,生成的证书现在包含以下(full output):

        X509v3 extensions:
            X509v3 Subject Alternative Name: 
               IP Address:<ip address>

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

$ 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'

虽然文件/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
  1. full
  2. https://docs.docker.com/registry/insecure/#use-self-signed-certificates
  3. https://docs.docker.com/registry/deploying/#run-an-externally-accessible-registry

3 个答案:

答案 0 :(得分:5)

我认为问题在于您没有复制证书并键入/etc/docker/certs.d/文件夹。

该文件夹应如下所示:

/etc/docker/certs.d/
└── openmpi-dockerregistry.local:443
   ├── client.cert
   ├── client.key
   └── ca.crt

在我的情况下,我没有ca.crt并且它工作正常。

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

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

答案 1 :(得分:2)

您需要编辑/etc/ssl/openssl.cnf以在IP SAN列表中具有FQDN(openmpi-dockerregistry.local)和IP地址。 添加如下:

[ v3_ca ]


# Extensions for a typical CA
subjectAltName = @alt_names
[ alt_names ]

IP.1 = <IP>
DNS.1 = openmpi-dockerregistry.local

现在使用以下命令生成证书:

openssl req -config /etc/ssl/openssl.cnf \                                 
  -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"

使用以下命令检查证书是否在IP SAN列表中具有IP和DNS:

openssl x509 -in domain.crt -text -noout

如果一切正常,您应该在输出中看到类似这样的内容:

X509v3 extensions:
            X509v3 Subject Alternative Name:
                IP Address:<IP>, DNS:openmpi-dockerregistry.local

现在将此证书复制到以下位置的 client docker certs目录中:

/etc/docker/certs.d/openmpi-dockerregistry.local/ca.crt

你现在应该很好。

答案 2 :(得分:0)

我有同样的问题。原来,创建证书时我没有添加CN或通用名称。我重新制作了证书,记得要包括CN,重新启动注册表,然后将证书复制到其他节点。这解决了我的问题。