使用自签名证书configuration本地registry

我想configuration一个本地dockerregistry与自我签署证书,我将在我的本地networking内使用。 我遵循docker手册[1,2]的指示,但仍然遇到错误。

确切地说,我的问题在于。 我在本地registry机器上创build一个自签名证书:

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本地机器的/etc/docker/certs.d/openmpi-dockerregistry:443/ca.crt

然后我开始注册并在那里推送一个图像。 由于我的networking中没有configurationDNS,所以我只是把一个入口放到/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,但是读取证书指出了相反的( 完整输出 ):

  $ 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 = *。 所以证书现在包含以下( 完整 ):

  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地址。

你能帮我find一种方法来从本地registry中拉出图像吗?

更新

我如何启动dockerregistry?

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

我认为问题是你没有复制证书和密钥在/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