Docker-рабочий стол для доступа к Mac API через порт 2376 с TLS / SSL с использованием socat - PullRequest
0 голосов
/ 25 мая 2019

для настольного компьютера Mac OSX порты tcp демона docker внутренней виртуальной машины xhyve / bhyve HyperKit (которая запускает демон docker) не доступны хосту (моему ноутбуку Mac)

настройки -> Демон -> Дополнительно:

{
  "experimental" : false,
  "tlskey" : "/path/to/certs/docker-server-tls-key.pem",
  "tls" : true,
  "tlscert" : "/path/to/certs/docker-server-tls-cert.pem",
  "tlscacert" : "/path/to/certs/docker-ca-cert.pem",
  "debug" : true
}

после https://github.com/docker/for-mac/issues/770 Мне удалось получить доступ к интерфейсу докера через незащищенный порт 2375 через контейнер socast, например:

UNSECURE_PORT=2375
docker run --name socat$UNSECURE_PORT --restart always -d \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -p 0.0.0.0:$UNSECURE_PORT:$UNSECURE_PORT \
    bobrik/socat \
        TCP-LISTEN:$UNSECURE_PORT,fork UNIX-CONNECT:/var/run/docker.sock

но мне нужно получить доступ к API через защищенный порт tls / ssl 2376

Я создал самозаверяющие сертификаты и пытаюсь приспособить вышеперечисленное к своим потребностям, но я не понимаю правильно

Есть идеи?

моя последняя попытка выглядит примерно так:

SECURE_PORT=2376
CERTSDIR="/path/to/certs"
TLSCACERT="docker-ca-cert.pem"
TLSCERT="docker-server-tls-cert.pem"
TLSKEY="docker-server-tls-key.pem"
docker run --name socat$SECURE_PORT --restart always -d \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v $CERTSDIR:/certs \
    -p 0.0.0.0:$SECURE_PORT:$SECURE_PORT \
    bobrik/socat \
        openssl-listen:$SECURE_PORT,fork,reuseaddr,cert=/certs/$TLSCERT,cafile=/certs/$TLSCACERT,key=/certs/$TLSKEY UNIX-CONNECT:/var/run/docker.sock
$ cd /path/to/certs
$ docker --tls --tlscacert=docker-ca-cert.pem --tlscert=docker-server-tls-cert.pem --tlskey=docker-server-tls-key.pem   -H 0.0.0.0:2376 version
Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:39 2019
 OS/Arch:           darwin/amd64
 Experimental:      true
error during connect: Get https://0.0.0.0:2376/v1.39/version: remote error: tls: handshake failure

Будем благодарны за любые идеи или другие достижения!


EDIT

ок, похоже, проблема с моим самозаверяющим сертификатом

error during connect: Get https://0.0.0.0:2376/v1.39/version: x509: cannot validate certificate for 0.0.0.0 because it doesn't contain any IP SANs

, поэтому я сгенерировал новые самозаверяющие сертификаты с:

CN=my.dev и echo subjectAltName = DNS:www.my.dev,DNS:*.my.dev,IP:127.0.0.1,IP:0.0.0.0 >> extfile.cnf

но теперь я получаю ошибку:

$ docker --tls --tlsverify --tlscacert=docker-ca-cert.pem --tlscert=docker-server-tls-cert.pem --tlskey=docker-server-tls-key.pem   -H 0.0.0.0:2376 version

error during connect: Get https://0.0.0.0:2376/v1.39/version: x509: certificate is not authorized to sign other certificates
...