Установка SSL-сертификата в Docker Swarm - PullRequest
0 голосов
/ 09 сентября 2018

Я использую docker stack для развертывания одной службы в нескольких цифровых океанических каплях (реплика> 1), один контейнер на каплю. Это бэкэнд-сервис моего приложения.

Я хочу установить сертификат SSL и закрытый ключ (и, как мы надеемся, автоматически обновлять), чтобы я мог использовать соединение TLS с настройкой завершения SSL, чтобы передача данных из Swarm LB в контейнеры была незашифрованной с использованием порта 80. Я также использую docker-machine cmd для установки моей цифровой океанической капельки ubuntu v16.04.

Как лучше всего это сделать?

Я попробовал следующее, и возникли две проблемы:

  1. Сначала я генерирую сертификат и закрытый ключ с помощью давайте зашифруем где-нибудь еще на сервере с установленным nginx (также связываюсь с моим DNS). После генерации сертификата / ключа я затем копирую и устанавливаю их обратно с docker swarm ca --rotate. Но чувствую, что этот подход неправильный.

  2. При установке 1. я попробовал curl бэкэнд-сервис. С портом 80 все в порядке, но кажется, что порт 443 говорит по протоколу http, и я вижу следующее:

    $ curl -vvv https://myurl.com:443/v1/check 
    *   Trying my.ip.address... 
    * Connected to myurl.com (my.ip.address) port 443 (#0) 
    * found 148 certificates in /etc/ssl/certs/ca-certificates.crt 
    * found 593 certificates in /etc/ssl/certs
    * ALPN, offering http/1.1
    * gnutls_handshake() failed: An unexpected TLS packet was received.
    * Closing connection 0
    
    curl: (35) gnutls_handshake() failed: An unexpected TLS packet was received.
    
    $ curl -vvv http://myurl.com:443/v1/check
    *   Trying my.ip.address...
    * Connected to myurl.com (my.ip.address) port 443 (#0)
    > GET /v1/check HTTP/1.1
    > Host: myurl.com:443
    > User-Agent: curl/7.47.0
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    < Server: nginx/1.10.3 (Ubuntu)
    < Date: Sun, 09 Sep 2018 11:06:39 GMT
    < Content-Type: application/json; charset=utf-8
    < Transfer-Encoding: chunked
    < Connection: keep-alive
    < Vary: Accept-Encoding, Origin
    < ETag: W/"843adc298b0b2ef417eabf2f82670fc9"
    < Cache-Control: max-age=0, private, must-revalidate
    < X-Request-Id: b201d205-4c63-4318-b965-cebabc056b29
    < X-Runtime: 0.078911
    < X-Rack-Cache: pass
    <
    * Connection #0 to host myurl.com left intact
    {"status":"ok","container_id":"8bd9981213e7"}
    

Спасибо, что пролили свет на эту тему!

Я также задал вопрос здесь:

https://forums.docker.com/t/installing-ssl-cert-in-docker-swarm/58073

1 Ответ

0 голосов
/ 06 августа 2019

Вы можете создавать сертификаты вручную, используя инструмент OpenSSL, и настраивать демон Docker для использования этих сертификатов.

Создание сертификатов сервера

  1. Создание секретных и открытых ключей CA:

    openssl genrsa -aes256 -out ca-key.pem 4096
    openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -out ca.pem
    
  2. Создание ключа сервера и запроса на подпись сертификата (CSR):

    openssl genrsa -out server-key.pem 4096
    openssl req -subj "/CN=my.company.com" -sha256 -new -key server-key.pem -out server.csr
    
  3. Подписать открытый ключ с помощью CA:

    echo subjectAltName = DNS:my.company.com,IP:127.0.0.1 >> extfile.cnf
    echo extendedKeyUsage = serverAuth >> extfile.cnf
    
  4. Генерация ключа:

    openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
    

Создание клиентских сертификатов

  1. Создание клиентского ключа и запроса на подпись сертификата:

    openssl genrsa -out key.pem 4096
    openssl req -subj '/CN=client' -new -key key.pem -out client.csr
    
  2. Создать файл конфигурации расширений:

    echo extendedKeyUsage = clientAuth >> extfile.cnf
    
  3. Подпишите закрытый ключ:
    openssl x509 -req -days 1000 -sha256 -in client.csr -CA ../server/ca.pem -CAkey ../server/ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
    
  4. Экспорт cert.pem в формат PFX для добавления в доверенные корневые центры сертификации
    openssl pkcs12 -export -in cert.pem -inkey key.pem -out cert.pfx
    

Настройка демона Docker с помощью /etc/docker/daemon.json

{
    "debug": false,
    "tls": true,
    "tlsverify": true,
    "tlscacert": "/etc/docker/certificates/server/ca.pem",
    "tlscert": "/etc/docker/certificates/server/server-cert.pem",
    "tlskey": "/etc/docker/certificates/server/server-key.pem",
    "hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"]
}

Запустить Docker Service

systemctl start docker

Ознакомьтесь с этой статьей Строительство трубопроводов Jenkins - Часть 1. Настройка Docker Swarm от Scalified.

Содержит пошаговое руководство по настройке Docker Swarm и созданию самозаверяющих сертификатов сервера и клиента. Я надеюсь, что это поможет решить вашу проблему.

...