Может ли небезопасный реестр докеров получить сертификат, подписанный центром сертификации, чтобы клиенты автоматически доверяли ему?

В настоящее время я настроил реестр следующим образом:

docker run -d \
  -p 10.0.1.4:443:5000 \
  --name registry \
  -v `pwd`/certs/:/certs \
  -v `pwd`/registry:/var/lib/registry \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/certificate.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/private.key \
  registry:latest

Используя Docker версии 17.06.2-ce, соберите cec0b72

Я получил свой Certificate.crt, private.key и ca_bundle.crt от Let's Encrypt. И я смог установить соединения https при использовании этих сертификатов на сервере nginx без необходимости явно доверять сертификатам на клиентском компьютере / в браузере.

Можно ли настроить взаимодействие пользователя с реестром докера, аналогичным таковому для сертифицированного СА веб-сайта, доступ к которому осуществляется через https, когда браузер / компьютер доверяет корневому ЦС и тем, кто находится в цепочке, включая мои сертификаты?

Замечания:

Конечно, я могу указать сертификат в файлах докера клиентов, как описано в этом руководстве: https://docs.docker.com/registry/insecure/. Тем не менее, это не адекватное решение для моих нужд.

Выход из curl -v https://docks.behar.cloud/v2/:

*   Trying 10.0.1.4...
* TCP_NODELAY set
* Connected to docks.behar.cloud (10.0.1.4) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate: docks.behar.cloud
* Server certificate: Let's Encrypt Authority X3
* Server certificate: DST Root CA X3
> GET /v2/ HTTP/1.1
> Host: docks.behar.cloud
> User-Agent: curl/7.54.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Length: 2
< Content-Type: application/json; charset=utf-8
< Docker-Distribution-Api-Version: registry/2.0
< X-Content-Type-Options: nosniff
< Date: Sun, 10 Sep 2017 23:05:01 GMT
< 
* Connection #0 to host docks.behar.cloud left intact

Краткий ответ: да. Моя проблема была вызвана тем, что у меня не было доверия к корневым сертификатам, из которых был подписан мой сертификат SSL. Вероятно, это связано с возрастом моей ОС. Смотрите ответ от Мэтта для получения дополнительной информации.

2 ответа

Решение

Docker обычно использует предоставляемый ОС пакет CA, поэтому сертификаты, подписанные доверенными корнями, должны работать без дополнительной настройки.

Сертификаты Let's Encrypt перекрестно подписаны корневым сертификатом IdentTrust (DST Root CA X3), поэтому большинство пакетов CA уже должны доверять своим сертификатам. Корневой сертификат Lets Encrypt (ISRG Root X1) также распространяется, но не будет таким распространенным из-за более поздней версии.

Docker 1.13+ будет использовать пакет CA хост-систем для проверки сертификатов. До 1.13 этого может не произойти, если вы установили пользовательский корневой сертификат. Так что если вы используете curl без какого-либо предупреждения TLS тогда docker Команды также должны работать одинаково.

Чтобы DTR распознал сертификаты, вам нужно отредактировать файл конфигурации, чтобы правильно указать свои сертификаты. DTR принимает и имеет специальные параметры для LetsEncrypt Certs, У них также есть определенные требования к ним. Вам нужно будет сделать файл конфигурации и смонтировать соответствующие каталоги, и тогда больше не будет проблем с insecure-registry ошибки и непризнанные сертификаты.

...
http:
  addr: localhost:5000
  prefix: /my/nested/registry/
  host: https://myregistryaddress.org:5000
  secret: asecretforlocaldevelopment
  relativeurls: false
  tls:
    certificate: /path/to/x509/public
    key: /path/to/x509/private
    clientcas:
      - /path/to/ca.pem
      - /path/to/another/ca.pem
    letsencrypt:
      cachefile: /path/to/cache-file
      email: emailused@letsencrypt.com
    ...
Другие вопросы по тегам