Https не работает для Ingress, CA Root не доверяет - PullRequest
0 голосов
/ 31 марта 2020

Я следовал следующему руководству по настройке AKS: https://github.com/Azure/phippyandfriends. Но сейчас я изо всех сил пытаюсь заставить HTTPS работать.

Вот что я сделал

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

bash generate-wildcard-certificate.sh mydomain.somenumbers.westeurope.aksapp.io

Генерирует 2 файла:

  • mydomain.somenumbers.westeurope.aksapp.io.crt
  • mydomain.somenumbers.westeurope.aksapp.io.key

Тогда Я создал секрет с помощью следующей команды:

kubectl create secret tls ingress-crypto-auth --key mydomain.somenumbers.westeurope.aksapp.io.crt --cert mydomain.somenumbers.westeurope.aksapp.io.crt

Добавил секрет в мои ingress.yaml файлы:

{{ if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: {{ template "fullname" . }}
  labels:
    app: {{ template "fullname" . }}
    chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
    release: "{{ .Release.Name }}"
    heritage: "{{ .Release.Service }}"
  annotations:
    kubernetes.io/ingress.class: addon-http-application-routing
spec:
  tls:
  - hosts:
    - {{ .Values.ingress.basedomain }}
    secretName: ingress-crypto-auth
  rules:
  - host: {{ .Release.Name }}.{{ .Values.ingress.basedomain }}
    http:
      paths:
      - path: /
        backend:
          serviceName: {{ template "fullname" . }}
          servicePort: {{ .Values.service.externalPort }}
{{ end }}

И кажется, что мой сертификат загружен , но я получаю следующую ошибку:

Этот сертификат CA Root не является доверенным, поскольку его нет в хранилище доверенных Root центров сертификации.

Сделал ли я сделать что-то не так? и что еще более важно, как мне заставить это работать? Мне все равно, как это для временного проекта

1 Ответ

1 голос
/ 06 апреля 2020

Это происходит потому, что вы используете самоподписанный сертификат.

A самоподписанный сертификат - это сертификат , который не подписан центр сертификации (CA). Эти сертификаты легко сделать и не стоят денег. Однако они не предоставляют все свойства безопасности, которые имеют целью предоставить сертификаты, подписанные ЦС. Например, когда владелец веб-сайта использует самозаверяющий сертификат для предоставления услуг HTTPS , люди, посещающие этот сайт, увидят предупреждение в своем браузере.

Для решения этой проблемы Вы можете купить действительный сертификат в доверенном центре сертификации или использовать Let's Encrypt для его генерации.

Использование cert-manager с Let's Encrypt

cert-manager основывается на Kubernetes, представляя центры сертификации и сертификаты как первоклассные типы ресурсов в API Kubernetes. Это позволяет предоставлять «сертификаты как услугу» разработчикам, работающим в вашем кластере Kubernetes.

Let's Encrypt - это некоммерческий центр сертификации, управляемый Inte rnet Security Research Group который предоставляет сертификаты X.509 для шифрования Transport Layer Security бесплатно. Сертификат действителен в течение 90 дней, в течение которых продление может иметь место в любое время. Я полагаю, у вас уже установлен NGINX вход и работает.

Предварительные требования: - NGINX Вход установлен и работает - HELM 3.0 установлен и работает

установка cert-manager

Примечание : при работе в GKE (Google Kubernetes Engine), вы можете столкнуться с ошибкой «отказано в разрешении» при создании некоторых из этих ресурсов. Это нюанс того, как GKE обрабатывает разрешения RBA C и IAM, и поэтому вы должны «повысить» свои собственные привилегии до уровня «cluster-admin» до , выполняющего указанную выше команду. Если вы уже выполнили указанную выше команду, вы должны запустить ее снова после повышения прав:

Выполните официальную документацию для установки или просто используйте HELM 3.0 с последующей командой :

$ kubectl create namespace cert-manager
$ helm repo add jetstack https://charts.jetstack.io
$ helm repo update
$ kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.14.1/cert-manager-legacy.crds.yaml

Создать CLusterIssuer для Let's Encrypt: сохранить содержимое ниже в новый файл с именем letsencrypt-production.yaml:

Примечание: Заменить <EMAIL-ADDRESS> с вашим действительным адресом электронной почты.

apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
  labels:
    name: letsencrypt-prod
  name: letsencrypt-prod
spec:
  acme:
    email: <EMAIL-ADDRESS>
    http01: {}
    privateKeySecretRef:
      name: letsencrypt-prod
    server: 'https://acme-v02.api.letsencrypt.org/directory'

Примените конфигурацию с помощью:

kubectl apply -f letsencrypt-production.yaml

Установите cert-manager с Let's Encrypt в качестве CA по умолчанию :

helm install cert-manager \
--namespace cert-manager --version v0.8.1 jetstack/cert-manager \
--set ingressShim.defaultIssuerName=letsencrypt-prod \
--set ingressShim.defaultIssuerKind=ClusterIssuer
Проверьте правильность установки:
$ kubectl get pods --namespace cert-manager

NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager-5c6866597-zw7kh               1/1     Running   0          2m
cert-manager-cainjector-577f6d9fd7-tr77l   1/1     Running   0          2m
cert-manager-webhook-787858fcdb-nlzsq      1/1     Running   0          2m

С помощью cert-manager

Примените эту аннотацию в вашей учетной записи spe c:

cert-manager.io/cluster-issuer: "letsencrypt-prod"

После применения сертификата -manager сгенерирует сертификат tls для домена, настроенного в Host:.

{{ if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: {{ template "fullname" . }}
  labels:
    app: {{ template "fullname" . }}
    chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
    release: "{{ .Release.Name }}"
    heritage: "{{ .Release.Service }}"
  annotations:
    kubernetes.io/ingress.class: addon-http-application-routing
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
  tls:
  - hosts:
    - {{ .Values.ingress.basedomain }}
    secretName: ingress-crypto-auth
  rules:
  - host: {{ .Release.Name }}.{{ .Values.ingress.basedomain }}
    http:
      paths:
      - path: /
        backend:
          serviceName: {{ template "fullname" . }}
          servicePort: {{ .Values.service.externalPort }}
{{ end }}

Пожалуйста, дайте мне знать, если это помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...