0

我正在虚拟机中实现 Notary。为了获得参考,我在主机 A上有一个 docker 注册表,我想在主机 B上部署 Notary Server、Signer 和 CLI,以将图像推送到注册表并从不同的机器对它们进行签名。但是,当我尝试在 Notary 的主机 B 上使用角色目标对图像进行签名时,就会出现问题。出现以下错误消息:

[root@HostB ~]# docker push my.registry:443/galera-leader-proxy:v1.0.0
The push refers to a repository [my.registry:443/galera-leader-proxy]
5f70bf18a086: Layer already exists
1de59669c563: Layer already exists
17dd9fb03617: Layer already exists
26093688fdcb: Layer already exists
e08be57f5919: Layer already exists
v1.0.0: digest: sha256:6e48967416ea76ba2825511da7b05107a41f585629009d18ccbf30a1e1ce0e5a size: 2179
Signing and pushing trust metadata
ERRO[0000] couldn't add target to targets: could not find necessary signing keys, at least one of these keys must be available: b92334936cf0a0f0e3fb9dce459212537387847ee288ce27762fd54850f89e6f
Failed to sign "my.registry:443/galera-leader-proxy":v1.0.0 - could not find necessary signing keys, at least one of these keys must be available: b92334936cf0a0f0e3fb9dce459212537387847ee288ce27762fd54850f89e6f
Error: could not find signing keys for remote repository my.registry:443/galera-leader-proxy, or could not decrypt signing key: could not find necessary signing keys, at least one of these keys must be available: b92334936cf0a0f0e3fb9dce459212537387847ee288ce27762fd54850f89e6f

Docker 映像被推送到注册表,但在签名时我收到错误消息,即找不到要签名的“密钥”。但是,如果我看到公证人的密钥,则找不到该密钥以进行签名(如果可用)。然后我不知道为什么会发生这种情况或者我配置错误:

[root@HostB ~]# dockernotary key list

ROLE        GUN                          KEY ID                                                              LOCATION
----        ---                          ------                                                              --------
root                                     7b8139837e3bf8b013f69bf0750d46ba0f70a6a6d9640eadcb592ae8a5ae2c0d    /home/gmaurelia/.docker/trust/private
snapshot    ...43/galera-leader-proxy    92cf3f72d573cab7b6045f72fe224a4ccf786e9ddd29c89b3a542b610061c763    /home/gmaurelia/.docker/trust/private
targets     ...43/galera-leader-proxy    b92334936cf0a0f0e3fb9dce459212537387847ee288ce27762fd54850f89e6f    /home/gmaurelia/.docker/trust/private


PD: alias dockernotary="notary -c 
/home/gmaurelia/.docker/trust/config.json -d 
/home/gmaurelia/.docker/trust/ -s https://notary-server:4443"

我什至不能在角色下签名:目标或目标/发布

4

2 回答 2

1

对于多个主机上的公证人,您需要在您的第一台主机上执行委托步骤。这是docker 记录的一个多步骤过程,涉及以下内容:

  • 在主机 B 上生成 TLS 密钥对(以下包括自签名步骤,您也可以由受信任的 CA 签名):

    openssl genrsa -out delegation.key 2048

    openssl req -new -sha256 -key delegation.key -out delegation.csr

    openssl x509 -req -sha256 -days 365 -in delegation.csr -signkey delegation.key -out delegation.crt

  • 将 crt 文件从主机 B 复制到主机 A,并在主机 A 上使用公证命令添加新的证书委托。然后将该更改发布到服务器(以下假设 docker.io 是您的服务器):

    notary delegation add docker.io/<username>/<imagename> targets/releases delegation.crt --all-paths

    notary publish docker.io/<username>/<imagename>

  • 在主机 B 上导入新的 TLS 密钥以供公证人使用:

    notary key import delegation.key --role user

现在您应该能够在主机 B 上生成签名了。

使用公证人,您应该注意保护和备份在主机 A 上生成的根证书。这通常称为脱机证书。如果您的两个主机的安全性不是问题(您完全信任它们),您可以简单地复制$HOME/.docker/trust两者之间的文件夹。

于 2017-12-19T13:28:55.343 回答
0

我遇到的问题是,在我 docker push 之前,我应用了命令:notary init my.registry:443/collection所以 notary 生成了一个具有不同键的集合,这样我就不能在任何角色下推送任何图像的 docker 也甚至是目标。

一旦我以正确的方式进行操作,我就应用了您提到的步骤,问题就解决了。公证人配置如下:

命令:树 $HOME/.docker/trust/

.docker/trust
├── certs
│   ├── delegation.crt
│   └── proof
│       ├── delegation.crt
│       ├── delegation.csr
│       └── delegation.key
├── config.json
├── private
│   ├── root_keys
│   │   └── 4e46a197de40621094f86e0cea4aa892d7c3cfb1b3400c64f6d7d82e4b97a470.key
│   └── tuf_keys
│       ├── 3269a0858ca91001c543435d0242e747bd08e68b52533f1b42028388ed02c7e6.key
│       └── my.registry:443
│           └── galera-leader-proxy
│               └── 
|           873ba8267df2be149fba2230441961812159c35537b18c133247239f4bafa989.key
├── root-ca.crt
├── tls
│   └── my.registry:443
│       └── root-ca.crt
└── tuf
    └── my.registry:443
        └── galera-leader-proxy
            ├── changelist
            └── metadata
                ├── root.json
                ├── snapshot.json
                ├── targets
                │   ├── kube1.json
                │   └── releases.json
                ├── targets.json
                └── timestamp.json

另一方面,为了正确配置客户端,我定义了以下别名:

alias dockernotary="notary -c $HOME/.docker/trust/config.json -d $HOME/.docker/trust/ -s https://notary-server:4443"

萨卢多斯。

于 2017-12-27T13:53:32.840 回答