【问题标题】:Https not working for Ingress, CA Root not trustedHttps 不适用于 Ingress,CA Root 不受信任
【发布时间】:2020-07-11 21:38:58
【问题描述】:

我一直在按照以下教程进行 AKS 设置:https://github.com/Azure/phippyandfriends。 但现在我正在努力让 HTTPS 正常工作。

这就是我所做的

我通过关注shell script 生成了证书和密钥 在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 根证书不受信任,因为它不在受信任的根证书颁发机构存储中。

我做错了吗?更重要的是,我如何让它发挥作用? 我不在乎临时项目的情况

【问题讨论】:

  • 您使用的是自签名证书,这是因为您没有有效的证书。您提到的脚本在创建证书时会显示此警告。自签名证书仅用于开发/测试目的...如果您需要有效的证书,我建议您查看 Let's Encrypt 和 cert-manager,如果这是您想要的,我很乐意为您提供帮助和发布答案以设置证书管理器/让我们加密以在您的应用程序中拥有有效证书。
  • 感谢您的回复,在互联网上搜索后,我发现它会是这样的。我现在正在学习以下教程:docs.microsoft.com/en-gb/azure/aks/ingress-static-ip,但我被困在Create a certificate object,你能帮忙吗?
  • 你为什么卡住了?我应该你可以使用 nginx ingres 实现你自己的证书管理器。您需要 aks 的静态 ip 和负载均衡器吗?

标签: ssl kubernetes azure-aks


【解决方案1】:

这是因为您使用的是自签名证书。

自签名证书是未经certificate authority (CA) 签名的certificate。这些证书很容易制作,而且不花钱。但是,它们并未提供 CA 签署的证书旨在提供的所有安全属性。例如,当网站所有者使用自签名证书提供HTTPS 服务时,访问该网站的人会在其浏览器中看到警告。

要解决此问题,您可以从受信任的 CA 购买有效证书,或使用 Let's Encrypt 生成它。

在 Let's Encrypt 中使用 cert-manager

cert-manager 构建在 Kubernetes 之上,将证书颁发机构和证书作为 Kubernetes API 中的一流资源类型引入。这使得向在您的 Kubernetes 集群中工作的开发人员提供“证书即服务”成为可能。

Let's Encrypt 是由 Internet Security Research Group 运营的非营利性证书颁发机构,免费为传输层安全加密提供 X.509 证书。证书有效期为 90 天,在此期间可随时进行更新。 我假设您已经安装了 NGINX 入口并可以正常工作。

先决条件: - NGINX Ingress 已安装并工作 - HELM 3.0 已安装并正常工作

证书管理器安装

注意:在 GKE(Google Kubernetes Engine)上运行时,您可能会在创建其中一些资源时遇到“权限被拒绝”错误。这是 GKE 处理 RBAC 和 IAM 权限的方式的细微差别,因此您应该在在运行上述命令之前将自己的权限“提升”到“集群管理员”的权限。如果您已经运行过上述命令,则应在提升权限后再次运行它们:

按照official docs 进行安装,或者使用 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

为 Let's Encrypt 创建 CLusterIssuer:将以下内容保存在名为 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

使用 Let's Encrypt 作为默认 CA 安装 cert-manager:

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.io/cluster-issuer: "letsencrypt-prod"

应用后,cert-manager 会为Host: 中配置的域生成tls 证书。

{{ 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 }}

如果有帮助,请告诉我。

【讨论】:

  • 我得到了它的工作,但这个解决方案看起来或多或少是我所做的,所以我接受了你的回答:)
猜你喜欢
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多