Сгенерировать закрытый ключ для SSL-сертификата, который будет использоваться внутри контейнера Docker

#django #docker #ssl #tls1.2 #traefik

#django #docker #ssl #tls1.2 #traefik

Вопрос:

Я работаю над проектом, который запускает Docker и имеет 3 контейнера:

  • Django
  • PostgreSQL
  • traefik
    Теперь я собираюсь сгенерировать закрытый ключ для добавления SSL-сертификата на мой веб-сайт, вопрос в том, где я должен сгенерировать закрытый ключ?
    Внутри основного сервера, на котором запущен Docker?
    или внутри контейнера Django?
    или внутри контейнера Traefik?
    Я использую trafik: alpine для trafik amp; python: 3.6-alpine для Django
    если это контейнер, в котором я должен сгенерировать закрытый ключ, какую командную строку я должен использовать внутри контейнера для генерации закрытого ключа?
    На самом деле я создал private.файлы key и certification.crt ссылались на них внутри файла traefik.toml, и я получил эту ошибку:
 failed to load X509 key pair: tls: failed to find any PEM data in certificate input
  

Вот почему я думаю, что проблема в моем личном.ключ, который я сгенерировал внутри основного сервера, а не внутри какого-либо контейнера.

Вот конфигурация, которую я использую внутри файла traefik.toml, если вы хотите узнать больше информации:

 logLevel = "INFO"
defaultEntryPoints = ["http", "https"]
# Entrypoints, http and https
[entryPoints]
  # http should be redirected to https
  [entryPoints.http]
  address = ":80"
    [entryPoints.http.redirect]
    entryPoint = "https"
  # https is the default
  [entryPoints.https]
  address = ":443"
    [entryPoints.https.tls]
    [[entryPoints.https.tls.certificates]]
    certFile = "/certs/ new_cert_v2.chained.crt"
    keyFile = "/certs/hrattendence_gs-group_nl.key"
    
[file]
[backends]
  [backends.django]
    [backends.django.servers.server1]
      url = "http://django:5000"
[frontends]
  [frontends.django]
    backend = "django"
    passHostHeader = true
    [frontends.django.headers]
      HostsProxyHeaders = ['X-CSRFToken']
    [frontends.django.routes.dr1]
      rule = "Host:IP here"
  

И вот полное сообщение об ошибке:

 traefik_1_623bf12389b8 | time="2020-09-19T14:24:35Z" level=info msg="Using TOML configuration file /etc/traefik/traefik.toml"
traefik_1_623bf12389b8 | time="2020-09-19T14:24:35Z" level=info msg="No tls.defaultCertificate given for https: using the first item in tls.certificates as a fallback."
traefik_1_623bf12389b8 | time="2020-09-19T14:24:35Z" level=info msg="Traefik version v1.7.16 built on 2019-09-13_01:12:20PM"
traefik_1_623bf12389b8 | time="2020-09-19T14:24:35Z" level=info msg="nStats collection is disabled.nHelp us improve Traefik by turning this feature on :)nMore details on: https://docs.traefik.io/basics/#collected-datan"
traefik_1_623bf12389b8 | time="2020-09-19T14:24:35Z" level=error msg="failed to load X509 key pair: tls: failed to find any PEM data in certificate input"
traefik_1_623bf12389b8 | time="2020-09-19T14:24:35Z" level=info msg="Preparing server http amp;{Address::80 TLS:<nil> Redirect:0xc000b04b40 Auth:<nil> WhitelistSourceRange:[] WhiteList:<nil> Compress:false ProxyProtocol:<nil> ForwardedHeaders:0xc0008fba60} with readTimeout=0s writeTimeout=0s idleTimeout=3m0s"
traefik_1_623bf12389b8 | time="2020-09-19T14:24:35Z" level=info msg="Preparing server https amp;{Address::443 TLS:0xc0007797a0 Redirect:<nil> Auth:<nil> WhitelistSourceRange:[] WhiteList:<nil> Compress:false ProxyProtocol:<nil> ForwardedHeaders:0xc0008fba80} with readTimeout=0s writeTimeout=0s idleTimeout=3m0s"
traefik_1_623bf12389b8 | time="2020-09-19T14:24:35Z" level=error msg="Unable to add a certificate to the entryPoint "https" : unable to generate TLS certificate : tls: failed to find any PEM data in certificate input"
traefik_1_623bf12389b8 | time="2020-09-19T14:24:35Z" level=info msg="Starting provider configuration.ProviderAggregator {}"
traefik_1_623bf12389b8 | time="2020-09-19T14:24:35Z" level=info msg="Starting server on :443"
traefik_1_623bf12389b8 | time="2020-09-19T14:24:35Z" level=info msg="Starting server on :80"
traefik_1_623bf12389b8 | time="2020-09-19T14:24:35Z" level=info msg="Starting provider *file.Provider {"Watch":true,"Filename":"","Constraints":null,"Trace":false,"TemplateVersion":0,"DebugLogGeneratedTemplate":false,"Directory":"","TraefikFile":"/etc/traefik/traefik.toml"}"
traefik_1_623bf12389b8 | time="2020-09-19T14:24:35Z" level=error msg="failed to load X509 key pair: tls: failed to find any PEM data in certificate input"
traefik_1_623bf12389b8 | time="2020-09-19T14:24:35Z" level=info msg="Server configuration reloaded on :80"
traefik_1_623bf12389b8 | time="2020-09-19T14:24:35Z" level=info msg="Server configuration reloaded on :443"

  

Ответ №1:

Вы должны сгенерировать сертификат TLS и закрытый ключ вне Docker, используя любой инструмент, который вы обычно используете. Это может быть openssl инструмент командной строки или размещенный инструмент, такой как менеджер сертификатов Amazon или LetsEncrypt, или более широкий инструмент управления учетными данными, такой как хранилище Hashicorp. Вероятно, у вас нет инструментов для создания и правильной подписи сертификата внутри вашего изображения, и это нормально.

После того, как у вас есть (подписанный) сертификат и закрытый ключ, вы можете использовать Docker bind mount, чтобы внедрить их в контейнер при его запуске. Например, если вы используете Docker Compose для запуска трех контейнеров, и у вас есть файл PEM и закрытый ключ в одном каталоге, вы можете установить

 services:
  traefik:
    volumes:
      - ./certs:/certs
  

для монтирования certs подкаталога текущего каталога /certs в контейнер.

Комментарии:

1. должен ли я преобразовать файл .crt в файл PEM?