Может ли небезопасный реестр докеров получить сертификат, подписанный центром сертификации, чтобы клиенты автоматически доверяли ему?
В настоящее время я настроил реестр следующим образом:
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
...