繁体   English   中英

Https 不适用于 Ingress,CA Root 不受信任

[英]Https not working for Ingress, CA Root not trusted

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

这是我所做的

我通过以下shell 脚本在 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 根证书不受信任,因为它不在受信任的根证书颁发机构存储中。

我做错了什么吗? 更重要的是,我如何让它工作? 我不在乎临时项目怎么样

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

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

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

在 Let's Encrypt 中使用 cert-manager

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

Let's Encrypt是一个由 Internet 安全研究小组运营的非营利性证书颁发机构,它免费提供用于传输层安全加密的 X.509 证书。 该证书的有效期为 90 天,在此期间可以随时更新。 我假设您已经安装并运行了 NGINX 入口。

先决条件: - NGINX Ingress安装并运行 - HELM 3.0安装并运行

证书管理器安装

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

按照官方文档进行安装,或者只使用带有 followe 命令的 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

使用证书管理器

在您的入口规范中应用此注释:

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

应用 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 }}

如果这有帮助,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM