Установка 2 пользовательских сертификатов TLS с Traefik / K8s - PullRequest
0 голосов
/ 20 января 2020

У меня есть кластер K8s, работающий хорошо, с доменом, в котором есть пользовательский сертификат SSL, а во всех других поддоменах используется подстановочный знак Let's encrypt.

Теперь я хочу добавить другой домен, который будет использовать пользовательский SSL Сертификат, но, похоже, он не работает.

Сначала я создаю configMap с файлами .crt и .key

kubectl create configmap traefik-sge-certificate --from-file=certificate/sge-prod.crt --from-file=certificate/sge-prod.key --dry-run -o yaml | kubectl apply -f -

Затем я добавляю свои сертификаты в traefik.toml

traefik.toml:
----
# traefik.toml
defaultEntryPoints = ["http","https"]
[entryPoints]
  [entryPoints.http]
  address = ":80"
  [entryPoints.http.redirect]
    entryPoint = "https"
  [entryPoints.https]
  address = ":443"
    [entryPoints.https.tls]
      [[entryPoints.https.tls.certificates]]
      certFile = "/etc/ene-certificate/api.crt"
      keyFile = "/etc/ene-certificate/api.key"
      [[entryPoints.https.tls.certificates]]
      certFile = "/etc/sge-certificate/sge-prod.crt"
      keyFile = "/etc/sge-certificate/sge-prod.key"

[acme] # Automatically add Let's Encrypt Certificate.
  storage= "/etc/certificate/acme.json"
  email = "julien@company.fr"
   entryPoint = "https"
   onHostRule = true
   caServer = "https://acme-v02.api.letsencrypt.org/directory"
    [acme.dnsChallenge]
    provider = "route53"
    delayBeforeCheck = 0
[[acme.domains]]
  main = "*.company.fr"

А теперь развертывание:

kind: Deployment
apiVersion: apps/v1
metadata:
  name: traefik-deployment
  labels:
    app: traefik
spec:
  replicas: 1
  selector:
    matchLabels:
      app: traefik
  template:
    metadata:
      labels:
        app: traefik
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 60
      volumes:
        - name: traefik-certificate
          persistentVolumeClaim:
            claimName: traefik-certificate
        - name: config
          configMap:
            name: traefik-config
        - name: traefik-ene-certificate
          configMap:
            name: traefik-ene-certificate
        - name: traefik-sge-certificate
          configMap:
            name: traefik-sge-certificate
      containers:
      - name: traefik
        image: "traefik:1.7"
        envFrom:
          - secretRef:
              name: traefik-env
        volumeMounts:
          - mountPath: "/etc/traefik/config"
            name: config
          - mountPath: "/etc/certificate"
            name: traefik-certificate
          - mountPath: "/etc/ene-certificate/api.crt"
            name: traefik-ene-certificate
            subPath: api.crt
          - mountPath: "/etc/ene-certificate/api.key"
            name: traefik-ene-certificate
            subPath: api.key           
          - mountPath: "/etc/sge-certificate/sge-prod.crt"
            name: traefik-sge-certificate
            subPath: sge-prod.crt
          - mountPath: "/etc/sge-certificate/sge-prod.key"
            name: traefik-sge-certificate
            subPath: sge-prod.key           

        args:
        - --configfile=/etc/traefik/config/traefik.toml
        - --api
        - --kubernetes

Но когда я это делаю, возникают 2 проблемы:

  • Мое новое приложение: https://sge.company.fr использует подстановочные сертификаты вместо пользовательских (цель этой операции)
  • Приложение, которое использовало пользовательские сертификаты api.crt (ранее хорошо работавший с пользовательским сертификатом SSL), не использует сертификаты с подстановочными знаками, это регрессия.

Я проверил журналы traefik, и у меня, похоже, нет проблем.

Что я тоже не понимаю, это где Пользовательский сертификат SSL связан с доменом.

Может кто-нибудь сказать мне, почему это происходит, и как мне это исправить?

PD: я понимаю, что я должен использовать секреты вместо configMaps, но первым делом!

1 Ответ

1 голос
/ 21 января 2020

Что я также не понимаю, так это где пользовательский сертификат SSL связан с доменом.

Сертификат выдан для определенного c домена. Итак, вот ссылка.

Если вы выдадите свой сертификат для domain1.com, а затем попытаетесь использовать его на domain2.com, Traefik не сможет его установить.

Моя ошибка заключалась в использовании другого домена, который тот, который прикреплен к моим сертификатам.

Итак, конфигурация в порядке, и теперь я могу получить доступ к домену с помощью своих пользовательских сертификатов

Надеюсь, это поможет другим

...