2017-11-11 187 views
2

我想配置一个本地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,但阅读出具的对面(full output):

$ 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):

 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 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
+0

检查注册表容器中的日志('docker logs --follow $ INSTANCENAME')。如果问题出现在证书中,您会立即看到。这将有助于查看注册表“config.yml”。 – Stefano

+0

它说:'从:44428:远程错误:tls:坏证书'TLS握手错误对于域名和IP地址访问。 – mcsim

+0

你可以分享你如何启动注册表? – Stefano

回答

1

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

+0

我确实在文件夹中错过了client.cert和client.key。我应该使用ca.crt以某种方式生成它们吗? – mcsim

+0

其实它们是你传递给注册表的'domain.crt'和'domain.key'。为了测试的目的,我在OSX上重复了相同的设置,故事很相似,但不是复制'/ etc/docker/certs.d /'中的文件,而是将它们复制到〜/ .docker/certs.d中/ openmpi-dockerregistry:443' – Stefano

+0

所以client.cert和ca.crt是同一个文件?正如我前面写的 – mcsim