最新:在TwitterMastodon

使用 ZeroSSL 保护入口

ZeroSSL

本指南将引导您使用 ZeroSSL 颁发者类型来保护 Kubernetes 入口 资源。

ZeroSSL 与 Let's Encrypt 及其竞争对手一样,允许创建免费的 90 天证书。只需在 https://zerossl.com/ 创建账户。然后进入开发者部分并生成 用于 ACME 客户端的 EAB 凭据。稍后您将需要它。

请注意!
EAB 凭据不会存储在您的账户中,请确保将其记录在某个地方。每次点击“生成”都会创建一个新的凭据集。即使您创建了多个凭据,它们都将保持功能。

先决条件

  • 一个 AWS 账户
  • 已安装 kubectl
  • 访问公开注册的 DNS 区域
  • Kubernetes 集群,您可以使用 AWS EKS
  • ingress-nginx 部署并运行在集群中

教程场景:

安装 cert-manager

确保您使用的是 cert-manager 1.8.2+/1.7.3+。有关更多详细信息,请参阅 链接

请仔细阅读安装指南,并在验证 cert-manager 正确部署后返回此步骤。按照 在 Kubernetes 上运行 下的步骤在 k8s 中安装。

为了自动切换到 ZeroSSL,我们建议通过将以下配置添加到值文件来设置默认垫片。

ingressShim:
defaultIssuerName: "zerossl-production"
defaultIssuerKind: "ClusterIssuer"
crds:
enabled: true

使用 helm 安装它

helm upgrade --install --namespace cert-manager --version v1.16.1 cert-manager jetstack/cert-manager -f values.yaml

配置您的 DNS 记录

使用 AWS 管理 DNS 的最佳方法是使用 Route53。创建具有修改 Route53 规则权限的 AWS 账户。

EAB 密钥

获取凭据后,第一步是使用密钥创建种子。它们负责与您的 ZeroSSL 账户进行身份验证。

$ kubectl create secret generic \
zero-ssl-eabsecret \
--namespace=cert-manager \
--from-literal=secret='YOUR_ZEROSSL_EAB_HMAC_KEY'

另一种创建密钥的方法。

首先将其编码为 base64。

echo -n "YOUR_ZEROSSL_EAB_HMAC_KEY" | base64 -w 0
apiVersion: v1
kind: Secret
metadata:
name: zero-ssl-eabsecret
data:
secret: YOUR_ENCODED_ZEROSSL_EAB_HMAC_KEY
kubectl apply -f zero-ssl-eabsecret.yaml -n cert-manager

集群颁发者

然后我们必须创建 ZeroSSL 集群颁发者,我们称之为 zerossl-production。在我们的案例中,我们使用的是 AWS。请参阅先决条件以配置所有必需的元素。

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: zerossl-production
spec:
acme:
# ZeroSSL ACME server
server: https://acme.zerossl.com/v2/DV90
email: dummy-email@yopmail.com
# name of a secret used to store the ACME account private key
privateKeySecretRef:
name: zerossl-prod
# for each cert-manager new EAB credencials are required
externalAccountBinding:
keyID: YOUR_ZEROSSL_EAB_KEY_ID
keySecretRef:
name: zero-ssl-eabsecret
key: secret
keyAlgorithm: HS256
# ACME DNS-01 provider configurations to verify domain
solvers:
- selector: {}
dns01:
route53:
region: us-west-2
# optional if ambient credentials are available; see ambient credentials documentation
# see Route53 for >0 issue "letsencrypt.org" and change to >0 issue "sectigo.com"
accessKeyID: ACCESS_KEY_ID
secretAccessKeySecretRef:
name: route53-credentials-secret
key: secret-access-key

然后运行:

$ kubectl apply -n cert-manager -f zerossl-production.yaml
$ kubectl describe Clusterissuer zerossl-prod
Status:
Acme:
Last Registered Email: dummy-email@yopmail.com
Uri: https://acme.zerossl.com/v2/DV90/account/tXXX_NwSv15rlS_XXXX
Conditions:
Last Transition Time: 2021-09-09T17:03:26Z
Message: The ACME account was registered with the ACME server
Reason: ACMEAccountRegistered
Status: True
Type: Ready

请注意!

如果此步骤失败并且 ACME 账户未注册,请检查 zero-ssl-eabsecret 中的密钥是否正确。

请求入口证书

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
namespace: default
spec:
rules:
- host: test.example.com
tls:
- secretName: secret-tls

应用 test-ingress

kubectl apply -f ingress.yaml

搞定!检查您的入口。

kubectl describe ingress test-ingress -n default
# check if tls is terminated using secret-tls
openssl s_client -showcerts -connect test.example.com:443
# verify server certificate and its chain