Не может подписывать и выдвигать метаданные доверия в нотариусе

Я внедряю нотариуса в виртуальной машине. Для справки у меня есть реестр докеров на хосте A, и я хочу развернуть Notary Server, Signer и CLI на хосте B, чтобы получить push-образы в реестр и подписать их с другого компьютера. Однако проблема возникает, когда я пытаюсь подписать образ на узле 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"

Я не могу даже подписать под ролью: цели или цели / релизы

2 ответа

Для нотариуса на нескольких хостах вам необходимо выполнить шаг делегирования на вашем первом хосте. Это многошаговый процесс, документированный докером, который включает в себя следующее:

  • сгенерируйте пару ключей TLS на хосте B (ниже приведен самозаверяющий шаг, вы также можете подписать его с помощью доверенного центра сертификации):

    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>

  • Импортируйте новый ключ TLS на хост B, который будет использоваться нотариусом:

    notary key import delegation.key --role user

Теперь вы должны иметь возможность генерировать подписи на хосте B.

С нотариусом вы должны позаботиться о защите и резервном копировании корневого сертификата, который был создан на хосте A. Это часто называют автономным сертификатом. Если безопасность ваших двух хостов не является проблемой (вы полностью им доверяете), вы можете просто скопировать $HOME/.docker/trust папка между двумя.

Проблема, с которой я столкнулся, заключалась в том, что перед нажатием Docker я применил команду: notary init my.registry: 443 / collection, чтобы нотариус сгенерировал коллекцию с разными ключами, и таким образом я не смог выполнить push-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"

Saludos.

Другие вопросы по тегам