Ван Сяньсэн2023-08-292023-08-29
Traefik
Внедрить автоматическое применениеHTTPS-сертификат
хотетьиспользоватьLet’s EncryptАвтоматически генерировать сертификаты,Обязательно использовать ACME. Требуется статическая конфигурация, определенная в «парсере сертификатов».,Traefik
Ответственный заACMEСлужить Получить сертификат с сервера。
Затем каждый «маршрутизатор» настраивается на включение TLS и связывается с преобразователем сертификатов с помощью параметра конфигурации tls.certresolver.
Методы проверки ACME Traefik в основном включают следующие три:
Если вы используете tlsChallenge, порт 443 от Let’s Encrypt к Traefik должен быть доступен. Если вы используете httpChallenge, порт 80 от Let’s Encrypt к Traefik должен быть доступен. При использовании dnsChallenge требуются соответствующие поставщики.
С помощью Kubernetes,Мы получаем мощный и масштабируемыйизплатформа для решения многих сложныхизсцена。cert-managerда Мощныйизрешение,Нам может помочь автоматизация управления с TLS Связанные с сертификатомизпочти все。этопоставлять Понятно Один набор для разныхсценаиз Пользовательское определение ресурса(CRD),И с роднымIngress
илиGateway
Ресурсы хорошо интегрированы。
cert-manager хранит и кэширует сертификаты и закрытые ключи в секретах Kubernetes, обеспечивая их высокую доступность для дальнейшего использования входными контроллерами (такими как Traefik Proxy) или приложениями.
Уведомление:По умолчанию,cert-manager Секрет не очищается автоматически, что позволяет повторно присоединить его к уже выданному сертификату и избежать выдачи нового сертификата. Это становится очень удобно, когда вам нужно создавать и удалять большое количество ресурсов и вы не хотите ограничивать скорость.
cert-manager Может взаимодействовать с различными источниками для выдачи сертификатов, в том числе Let's Encrypt
、HashiCorp
、Vault
и частный ПКИ. Для АВС Частный центр сертификации, Google Cloud Служба центра сертификации или Cloudflare Origin CA Внешние эмитенты позволяют расширять функциональные возможности диспетчера сертификатов, если они не поддерживаются.
Чтобы следовать этому руководству, вам необходимо следующее:
Тенсент Облако
Traefik 2.10
,Вы можете установить развертывание, прочитав эту статью. Обновление развертывания Kubernetes Traefik2.6Вы можете установить cert-manager 1.12, используя следующую команду:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.12.3/cert-manager.yaml
Предоставляет услуги веб-порта. В этом уроке я буду использовать whoami в качестве примера.
cat > whoami.yml <<EOF
apiVersion: v1
kind: Service
metadata:
name: whoami
spec:
ports:
- protocol: TCP
name: web
port: 80
selector:
app: whoami
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: whoami
labels:
app: whoami
spec:
replicas: 1
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: containous/whoami
ports:
- name: web
containerPort: 80
EOF
Давайте разберемся, как объединить Kubernetes Входной контроллер (например. Traefik Proxy и диспетчер сертификатов) для защиты Web Безопасность приложений. Давайте Encrypt поставлять РазличныйТип соревнованияПриходитьпроверятьдоменное имяизконтроль。в соответствии стыизхотетьпросить,Вы можете выбратьHTTP-01
тыиз Служить Когда он появится в публичном доступе?илиDNS-01
частная конечная точка。
использовать Let Encrypt Обратите внимание на ограничения по тарифам. для Во избежание неприятных сюрпризов рекомендуется использовать Let’s Encryptпромежуточная среда:
#тест(staging): https://acme-staging-v02.api.letsencrypt.org/directory
#Производство(производство): https://acme-v02.api.letsencrypt.org/directory
Let’s Encrypt использовать ACME протокол для проверки того, действительно ли доменное имя принадлежит вам. После успешной проверки может быть автоматически выдан бесплатный сертификат. Сертификат действителен только для. 90 дней, его необходимо еще раз подтвердить до истечения срока действия, чтобы добиться продления, и cert-manager Его можно автоматически продлить, поэтому вам не придется беспокоиться об истечении срока действия сертификата. В настоящее время существуют в основном HTTP и DNS Два метода проверки.
HTTP-01
Проверка осуществляется путем указания вашего доменного имени. HTTP Сервис добавляет временный местоположение: во время проверки Let’s Encrypt отправлю http просил http://<YOUR_DOMAIN>/.well-known/acme-challenge/<TOKEN>
,в YOUR DOMAIN Это доменное имя, которое проверяется, TOKEN. да ert-manager Путь, созданный путем изменения Ingress Правила для добавления этого временного пути проверки и указания на предоставленный ТОКЕН. услуги. Давайте Encrypt Сравню TOKEN Если да соответствует ожиданиям, сертификат будет выдан после успешной проверки, но этот метод не поддерживает пан-доменное имя Сертификат。
использовать HTTP проверить таким способом сначала нужно добавить доменное анализ имени Конфигурация хорошая, то есть нужно обеспечить ACME Сервер может получить доступ к вашему серверу в обычном режиме HTTP-сервис. Здесь мы используем вышеизложенное Для примера приложения whoami у нас есть
whoami.boysec.cn
Доменное имя разрешено правильно.
Публичный IP-адрес должен быть привязан сюда.
потому что Let’s Encrypt В производственной среде действуют строгие ограничения на вызовы интерфейсов, поэтому обычно нам необходимо сначала staging После прохождения теста среды переключитесь в производственную среду. Сначала мы создаем тестовую среду по умолчанию и производственную среду. HTTP-1 Центр сертификации для метода проверки:
среда тестирования среда сборки
cat <<EOF >staging-http.yml
apiVersion: cert-manager.io/v1
kind: Issuer # Выберите весь кластер (ClusterIssuer) или одно пространство имен.
metadata:
name: staging-http01
spec:
acme:
email: wangxiansen@boysec.cn # используется для ACME Зарегистрированный адрес электронной почты
# ACME Служитьконецадрес
server: https://acme-staging-v02.api.letsencrypt.org/directory
privateKeySecretRef:
# используется для Хранения ACME номер счета private key из secret
name: boysec-staging-http01
solvers:
- http01: # ACME HTTP-01 тип
ingress:
class: traefik # Укажите входное имя
EOF
cat <<EOF >production-http.yml
apiVersion: cert-manager.io/v1
kind: Issuer # Выберите весь кластер (ClusterIssuer) или одно пространство имен.
metadata:
name: production-http01
spec:
acme:
email: wangxiansen@boysec.cn # используется для ACME Зарегистрированный адрес электронной почты
# ACME Служитьконецадрес
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
# используется для Хранения ACME номер счета private key из secret
name: boysec-http01
solvers:
- http01: # ACME HTTP-01 тип
ingress:
class: traefik # Укажите входное имя
EOF
После создания вы можете увидеть два объекта эмитентов:
kubectl get issuers
Понятно Issuer/ClusterIssuer Центр сертификации, затем мы можем сгенерировать бесплатный сертификат, cert-manager предоставил нам Certificate Это используется длягенерировать Сертификатиз Пользовательский объект ресурса,Однако этот объект требуетхотетьсуществоватьконкретныйизв пространстве имениспользовать,Сертификатв конце концов будетсуществоватьэтотв пространстве именк Secret из Хранилище объектов ресурсов。Вот мы здесьдахотетьобъединить traefik
вместе использовать, на самом деле нам просто нужно изменить Ingress объект, добавить cert-manager Просто обратите внимание на соответствующие комментарии и не нужно создавать их вручную. Certificate Объект, измените вышеуказанное приложение whoami Ingress Объект ресурса, как показано ниже:
cat << EOF >ing.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: whoami
annotations:
cert-manager.io/issuer: "staging-http01"
spec:
tls:
- hosts:
- whoami.boysec.cn
secretName: whoami-tls
rules:
- host: whoami.boysec.cn
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: whoami
port:
name: web
EOF
проверять
$ kubectl get issuer -o wide
NAME READY STATUS AGE
production-http01 True The ACME account was registered with the ACME server 18m
staging-http01 True The ACME account was registered with the ACME server 19m
$ kubectl get certificateRequest -o wide
NAME APPROVED DENIED READY ISSUER STATUS
tls-whoami-ingress-http-fdw2x True True le-example-http Certificate fetched from issuer successfully
$ kubectl get certificates
NAME READY SECRET ISSUER STATUS
tls-whoami-ingress-http True tls-whoami-ingress-http le-example-http Certificate is up to date and has not expired
путем измененияtraefik ConfigMap
документ
entryPoints:
web:
address: ":80" ## Конфигурация 80 порт и установите имя записи для web
websecure:
address: ":443" # Конфигурация443порт и установите имя записи для websecure
certificatesResolvers:
wangxiansen-test: # Вы можете изменить его на свое любимое имя
acme:
caServer: https://acme-staging-v02.api.letsencrypt.org/directory # ACME Служитьконецадрес
email: wangxiansen@boysec.cn # В это время вы подаете заявку на выдачу Сертификатиз Почта
storage: acme-staging-web.json # место хранения
httpChallenge:
entryPoint: web
wangxiansen: # Вы можете изменить его на свое любимое имя
acme:
email: wangxiansen@boysec.cn # В это время вы подаете заявку на выдачу Сертификатиз Почта
storage: acme-web.json # место хранения
httpChallenge:
entryPoint: web
создать входной маршрут
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: whoamiauto-tls-http
spec:
entryPoints:
- web
routes:
- match: Host(`whoami.boysec.cn`)
kind: Rule
services:
- name: whoami
port: 80
tls:
certResolver: wangxiansen-test
Откройте браузер и вы найдете приложениетестиз Сертификат Понятно,а затем изменитьcertResolver
для wangxiansen
DNS-01 проверь, чтобы пройти DNS провайдера API возьми свое DNS разрешения на управление, существовать Let’s Encrypt для cert-manager поставлять TOKEN После этого сертификат-менеджер будет создан из этого TOKEN получение ключа вашей учетной записи из TXT Запишите и поставьте запись в существование _acme-вызов. Затем Let’s Encrypt воля DNS Система запрашивает запись, и если совпадение найдено, сертификат может быть выдан. Этот подход поддерживает пан-доменное. имя Сертификатиз。
среда тестирования среда сборки
cat <<EOF >staging-dns.yml
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: boysec-staging-dns
namespace: whoami
spec:
acme:
email: user@example.com
# We use the staging server here for testing to avoid hitting
server: https://acme-staging-v02.api.letsencrypt.org/directory
privateKeySecretRef:
# if not existing, it will register a new account and stores it
name: boysec-staging-key
solvers:
- dns01:
cloudflare:
apiTokenSecretRef:
name: cloudflare-api-token-secret
key: api-token
EOF
cat <<EOF >production-dns.yml
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: boysec-dns
namespace: whoami
spec:
acme:
email: user@example.com
# We use the staging server here for testing to avoid hitting
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
# if not existing, it will register a new account and stores it
name: boysec-key
solvers:
- dns01:
cloudflare:
apiTokenSecretRef:
name: cloudflare-api-token-secret
key: api-token
EOF
путем измененияtraefik ConfigMap
документ
entryPoints:
web:
address: ":80" ## Конфигурация 80 порт и установите имя записи для web
websecure:
address: ":443" # Конфигурация443порт и установите имя записи для websecure
certificatesResolvers:
tencent-test: # Вы можете изменить его на свое любимое имя
acme:
email: wangxiansen@boysec.cn # В это время вы подаете заявку на выдачу Сертификатиз Почта
storage: acme-staging-dns.json
caServer: https://acme-staging-v02.api.letsencrypt.org/directory
dnsChallenge:
provider: tencentcloud # Тенсент Облакоиз кодирования
delayBeforeCheck: 0
resolvers:
- "119.29.29.29:53" # Тенсент Облакоиз DNS адрес
tencent: # Вы можете изменить его на свое любимое имя
acme:
email: wangxiansen@boysec.cn # В это время вы подаете заявку на выдачу Сертификатиз Почта
storage: acme-dns.json
dnsChallenge:
provider: tencentcloud # Тенсент Облакоиз кодирования
delayBeforeCheck: 0
resolvers:
- "119.29.29.29:53" # Тенсент Облакоиз DNS адрес
Затем создайте ключ
kubectl create secret generic tencent-token --from-literal=TENCENTCLOUD_SECRET_ID=AKIDoSadfsafdsfasdfsdfLBj23 --from-literal=TENCENTCLOUD_SECRET_KEY=lFTP4afafasdfsfdfsgasfgfMK1Ra7NM -n kube-system
$ kubectl edit -n kube-system pods traefik-v2-6996759d46-d9czt
spec:
serviceAccountName: traefik-ingress-controller
terminationGracePeriodSeconds: 1
containers:
- name: traefik-v2
image: traefik:v2.10
args:
- --configfile=/config/traefik.yaml
envFrom: # Добавьте переменные среды
- secretRef:
name: tencent-token
создать входной маршрут
cat << EOF > auto-tls-dns.yml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: whoami-auto-tls-dns
spec:
entryPoints:
- websecure
routes:
- match: Host(\`who.boysec.cn\`)
kind: Rule
services:
- name: whoami
port: 80
tls:
certResolver: tencent-test
domains:
- main: boysec.cn
sans:
- '*.boysec.cn' # Соответствует всем сайтам boysec.cn из Вторичного доменного имени. имя
EOF
Откройте его и вы увидите, что сертификат испытаний выдан.,可кзаменятьгенерироватьсреда Сертификат ВоляcertResolver
заменятьдля Производствосреда Сертификат
Вы узнаете, когда приедете снова Сертификатда Доверенныйиз Понятно
потому чтописать статьитест Слишком много одеялаОграничения на дублирование заявок на доменное имя,Итак, сначала сделайте снимок экрана диаграммы тестовой среды.,Сгенерированная карта среды будет добавлена позже.