Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅
中国的 Amazon Web Services 服务入门
(PDF)。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
开始使用适用于 Kubernetes 的 Amazon 私有 CA 连接器。
以下主题介绍如何使用 Amazon 私有 CA 来保护 Kubernetes 集群中的通信。有关另一个示例,请参阅开启的 Kubernetes 传输中的加密。 GitHub
您可以使用私有证书颁发机构来保护与 Amazon EKS 集群的通信。在您开始之前,请确保您已拥有以下各项:
-
具有适当权限的 Amazon 账户,其范围仅限于您的安全策略。
- Amazon EKS clusters
-
JSON
- JSON
-
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "IAM",
"Effect": "Allow",
"Action": [
"iam:CreateRole",
"iam:AttachRolePolicy",
"iam:GetRole"
],
"Resource": "*"
},
{
"Sid": "EKS",
"Effect": "Allow",
"Action": [
"eks:CreateAddon",
"eks:DescribeAddon",
"eks:CreatePodIdentityAssociation",
"eks:DescribeCluster"
],
"Resource": "*"
},
{
"Sid": "IAMPassRole",
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": "arn:aws:iam::*:role/CertManagerPrivateCARole"
}
]
}
- Other clusters
-
JSON
- JSON
-
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "GetAndIssuePCACertificates",
"Effect": "Allow",
"Action": [
"acm-pca:GetCertificate",
"acm-pca:IssueCertificate"
],
"Resource": "*"
},
{
"Sid": "RolesAnywhere",
"Effect": "Allow",
"Action": [
"rolesanywhere:CreateProfile"
],
"Resource": "*"
},
{
"Sid": "IAM",
"Effect": "Allow",
"Action": [
"iam:CreateRole",
"iam:AttachRolePolicy"
],
"Resource": "*"
},
{
"Sid": "IAMPassRole",
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": "arn:aws:iam::*:role/CertManagerPrivateCARole"
}
]
}
-
一个 Kubernetes 集群。要创建亚马逊 Elastic Kubernetes Service 集群,请参阅亚马逊 EKS 快速入门指南。为简单起见,创建一个环境变量来保存集群名称:
export CLUSTER=aws-privateca-demo
-
您的 Amazon Web Services 区域 CA 和 Amazon EKS 集群所在的位置。为简单起见,创建一个环境变量来保存区域:
export REGION=aws-region
-
Amazon 私有 CA 私有证书颁发机构的亚马逊资源名称 (ARN)。为简单起见,创建一个环境变量来保存私有 CA ARN:
export CA_ARN="arn:aws:acm-pca:region:account:certificate-authority/CA_ID/certificate/certificate_ID"
要创建私有 CA,请参阅中的https://docs.amazonaws.cn/privateca/latest/userguide/create-CA.html创建私有 CA Amazon 私有 CA
-
一台安装了以下软件的计算机:
安装证书管理器
要使用私有 CA,必须安装请求证书、分发证书和自动续订证书的cert-manager>插件。您还必须安装允许您从中颁发私有证书的aws-private-ca-issuer插件 Amazon 私有 CA。使用以下步骤安装插件和插件。
- Amazon EKS clusters
-
cert-manager作为 Amazon EKS 附加组件安装:
aws eks create-addon \
--cluster-name $CLUSTER \
--addon-name cert-manager \
--region $REGION
- Other clusters
-
cert-manager使用 Helm 进行安装:
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--set crds.enabled=true
配置 IAM 权限
该aws-privateca-issuer插件需要与之交互的权限 Amazon 私有 CA。对于 Amazon EKS 集群,您可以使用容器身份。对于您使用的其他集群 Amazon Identity and Access Management Roles Anywhere。
首先,创建一个 IAM 策略。该策略使用AWSPrivateCAConnectorForKubernetesPolicy托管策略。有关该策略的更多信息,请参阅AWSPrivateCAConnectorForKubernetesPolicy《Amazon 托管策略参考指南》。
- Amazon EKS clusters
-
-
创建一个名为的文件,trust-policy.json其中包含以下信任策略:
JSON
- JSON
-
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "TrustPolicyForEKSClusters",
"Effect": "Allow",
"Principal": {
"Service": "pods.eks.amazonaws.com"
},
"Action": [
"sts:AssumeRole",
"sts:TagSession"
]
}
]
}
-
运行以下命令创建 IAM 角色:
ROLE_ARN=$(aws iam create-role \
--role-name CertManagerPrivateCARole \
--assume-role-policy-document file://trust-policy.json \
--region $REGION \
--output text \
--query "Role.Arn")
aws iam attach-role-policy \
--role-name CertManagerPrivateCARole \
--policy-arn arn:aws:iam::aws:policy/AWSPrivateCAConnectorForKubernetesPolicy
- Other clusters
-
-
创建信任存储在中的私有 CA 的信任锚CA_ARN。有关说明,请参阅入门 IAM Roles Anywhere。创建一个环境变量来存储信任锚点 ARN:
export TRUST_ANCHOR_ARN=trustAnchorArn
-
创建一个名为的文件,trust-policy.json其中包含以下信任策略:
JSON
- JSON
-
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "TrustPolicyForSelfManagedOrOnPremiseClusters",
"Effect": "Allow",
"Principal": {
"Service": "rolesanywhere.amazonaws.com"
},
"Action": [
"sts:AssumeRole",
"sts:SetSourceIdentity",
"sts:TagSession"
],
"Condition": {
"ArnEquals": {
"aws:SourceArn": [
"arn:aws:rolesanywhere:us-east-1:123456789012:trust-anchor/TRUST_ANCHOR_ARN"
]
},
"StringEquals": {
"aws:PrincipalTag/x509Subject/CN": "aws-privateca-issuer"
}
}
}
]
}
-
运行以下命令创建 IAM 角色:
ROLE_ARN=$(aws iam create-role \
--role-name CertManagerPrivateCARole \
--assume-role-policy-document file://trust-policy.json \
--query "Role.Arn" \
--region $REGION \
--output text)
aws iam attach-role-policy \
--role-name CertManagerPrivateCARole \
--region $REGION \
--policy-arn arn:aws:iam::aws:policy/AWSPrivateCAConnectorForKubernetesPolicy
安装和配置 Amazon 私有 CA 集群发行者
要安装该aws-privateca-connector-for-kubernetes插件,请使用以下命令:
- Amazon EKS clusters
-
创建附加组件:
aws eks create-addon --region $REGION \
--cluster-name $CLUSTER \
--addon-name aws-privateca-connector-for-kubernetes \
--pod-identity-associations "[{
\"serviceAccount\": \"aws-privateca-issuer\",
\"roleArn\": \"$ROLE_ARN\"
}]"
然后等待插件激活:
aws eks describe-addon \
--cluster-name $CLUSTER \
--addon-name aws-privateca-connector-for-kubernetes \
--region $REGION \
--query 'addon.status'
- Other clusters
-
-
在以下位置创建个人资料 IAM Roles Anywhere:
PROFILE_ARN=$(aws rolesanywhere create-profile \
--name "privateca-profile" \
--role-arns "$ROLE_ARN" \
--region "$REGION" \
--query 'profile.profileArn' \
--enabled \
--output text)
-
生成客户端证书,用于 Kubernetes 的连接器使用,并通过以下方式 IAM Roles Anywhere 进行身份验证: Amazon 私有 CA
-
为客户证书生成私钥:
openssl genrsa -out client.key 2048
-
为客户端证书生成证书签名请求 (CSR):
openssl req -new \
-key client.key \
-out client.csr \
-subj "/CN=aws-privateca-issuer"
-
从 Amazon 私有 CA以下地址颁发客户证书:
CERT_ARN=$(aws acm-pca issue-certificate \
--signing-algorithm SHA256WITHRSA \
--csr fileb://client.csr \
--validity Value=1,Type=DAYS \
--certificate-authority-arn "$CA_ARN" \
--region "$REGION" \
--query 'CertificateArn' \
--output text)
-
将客户端证书存储在本地:
aws acm-pca get-certificate \
--certificate-authority-arn $CA_ARN \
--certificate-arn $CERT_ARN \
--region $REGION \
--query 'Certificate'
--output text > pca-issuer-client-cert.pem
-
使用客户端证书在集群中安装 Amazon 私有 CA 发行者:
-
添加 awspca Helm 存储库:
helm repo add awspca https://cert-manager.github.io/aws-privateca-issuer
helm repo update
-
创建命名空间:
kubectl create namespace aws-privateca-issuer
-
将之前创建的证书放入密钥中:
kubectl create secret tls aws-privateca-credentials \
-n aws-privateca-issuer \
--cert=pca-issuer-client-cert.pem \
--key=client.key
-
使用以下命令安装 Amazon 私有 CA 发行者 IAM Roles Anywhere:
-
创建一个名为的文件values.yaml,将 Amazon 私有 CA 发行者插件配置为与以下内容一起使用 IAM Roles Anywhere:
cat > values.yaml <<EOF
env:
AWS_EC2_METADATA_SERVICE_ENDPOINT: "http://127.0.0.1:9911"
extraContainers:
- name: "rolesanywhere-credential-helper"
image: "public.ecr.aws/rolesanywhere/credential-helper:latest"
command: ["aws_signing_helper"]
args:
- "serve"
- "--private-key"
- "/etc/cert/tls.key"
- "--certificate"
- "/etc/cert/tls.crt"
- "--role-arn"
- "$ROLE_ARN"
- "--profile-arn"
- "$PROFILE_ARN"
- "--trust-anchor-arn"
- "$TRUST_ANCHOR_ARN"
volumeMounts:
- name: cert
mountPath: /etc/cert/
readOnly: true
volumes:
- name: cert
secret:
secretName: aws-privateca-credentials
EOF
-
使用以下命令安装 Amazon 私有 CA 发行者 IAM Roles Anywhere:
helm install aws-privateca-issuer awspca/aws-privateca-issuer \
-n aws-privateca-issuer \
-f values.yaml
等待发行人准备就绪。使用以下命令:
kubectl wait --for=condition=ready pods --all -n aws-privateca-issuer --timeout=120s
然后验证安装情况,确保所有 pod 都已达到READY状态:
kubectl -n aws-privateca-issuer get all
要配置aws-private-ca-cluster-issuer,请创建一个名为的 YAML 文件,cluster-issuer.yaml其中包含颁发者的配置:
cat > cluster-issuer.yaml <<EOF
apiVersion: awspca.cert-manager.io/v1beta1
kind: AWSPCAClusterIssuer
metadata:
name: aws-privateca-cluster-issuer
spec:
arn: "$CA_ARN"
region: "$REGION"
EOF
接下来,应用集群配置:
kubectl apply -f cluster-issuer.yaml
检查发行人的状态:
kubectl describe awspcaclusterissuer aws-privateca-cluster-issuer
您可以看到类似以下内容的响应:
Status:
Conditions:
Last Transition Time: 2025-08-13T21:00:00Z
Message: AWS PCA Issuer is ready
Reason: Verified
Status: True
Type: Ready
使用证书管理器管理 Amazon 私有 CA 客户证书
如果您未使用 Amazon EKS 集群,则在中手动引导可信证书后,aws-privateca-issuer您可以过渡到由cert-manager管理的客户端身份验证证书。这cert-manager允许自动续订客户端身份验证证书。
-
创建一个名为pca-auth-cert.yaml:的文件
cat > pca-auth-cert.yaml <<EOF
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: aws-privateca-client-cert
namespace: aws-privateca-issuer
spec:
secretName: aws-privateca-credentials
duration: 168h
renewBefore: 48h
commonName: aws-privateca-issuer
privateKey:
algorithm: ECDSA
size: 256
rotationPolicy: Always
usages:
- client auth
issuerRef:
name: aws-privateca-cluster-issuer
kind: AWSPCAClusterIssuer
group: awspca.cert-manager.io
EOF
-
创建新的托管客户端身份验证证书:
kubectl apply -f pca-auth-cert.yaml
-
验证证书是否已创建:
kubectl get certificate aws-privateca-client-cert -n aws-privateca-issuer
您可以看到类似以下内容的响应:
NAME READY SECRET AGE
aws-privateca-client-cert True aws-privateca-credentials 19m
颁发您的第一个 TLS 证书
现在cert-manager和已安装aws-privateca-issuer完毕,您可以颁发证书。
创建一个名为的 YAML 文件,certificate.yaml其中包含证书资源:
cat > certificate.yaml <<EOF
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: example-certificate
namespace: default
spec:
secretName: example-certificate-tls
issuerRef:
name: aws-privateca-cluster-issuer
kind: AWSPCAClusterIssuer
group: awspca.cert-manager.io
commonName: example.internal
dnsNames:
- example.internal
- api.example.internal
duration: 2160h # 90 days
renewBefore: 360h # 15 days
usages:
- digital signature
- key encipherment
- server auth
EOF
使用以下命令应用证书:
kubectl apply -f certificate.yaml
然后,您可以使用以下命令检查证书的状态:
kubectl get certificate example-certificate
kubectl describe certificate example-certificate
您应该会看到类似于以下内容的响应:
NAME READY SECRET AGE
example-certificate True example-certificate-tls 30s
您可以使用以下命令检查已颁发的证书:
kubectl get secret example-certificate-tls -o yaml
您也可以使用以下命令对证书进行解码和检查:
kubectl get secret example-certificate-tls -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text -noout