-
- 基于 openssl 命令创建自签名的证书
-
- 基于 helm chart 创建自签名的证书
-
- 基于 cert-manager 创建自签名的证书
1. 基于 openssl 命令创建自签名的证书
# 为 CA 生成一个私钥(ca.key),以及 一个证书 (ca.crt)
openssl req -x509 -sha256 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 356 -nodes -subj '/CN=Health Certificate Authority'
# 为你的服务(*.orthweb.com) 创建一个私钥 以及 一个 csr (Certificate Signing Request) 证书签名请求文件
openssl req -new -newkey rsa:4096 -keyout server.key -out server.csr -nodes -subj '/CN=*.orthweb.com'
# 使用 CA 的签名私钥对 csr 进行签名就生成了 该(web)应用所需要的证书
openssl x509 -req -sha256 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
然后保存为 k8s secret 即可
kubectl create -n orthweb secret generic orthweb-cred --from-file=tls.key=server.key --from-file=tls.crt=server.crt --from-file=ca.crt=ca.crt
2. 基于 helm chart 创建自签名的证书
helm chart 依然需要配合一个 genSingedCert 脚本使用,脚本大致如上,只不过 secret 要求生成的私钥,证书,ca 证书,都要经过 base64 编码才能存储
{{- $dbtlscert := genSignedCert .Values.dbtls.certCommonName nil (list .Values.dbtls.certCommonName) 365 $ca }}
apiVersion: v1
kind: Secret
metadata:
name: {{ .Values.dbtls.certCommonName | quote }}
namespace: {{ $.Release.Namespace | quote }}
type: kubernetes.io/tls
data:
tls.crt: {{ $dbtlscert.Cert | b64enc | quote }}
tls.key: {{ $dbtlscert.Key | b64enc | quote }}
ca.crt: {{ $ca.Cert | b64enc | quote }}
{{- end }}
3. 基于 cert-manager 创建自签名的证书
使用 cert-manager 来生成 X.509 证书,并直接存储到 k8s secret 中,是非常流行的做法。
# 安装 cert-manager
kubectl create namespace cert-manager
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.12.1/cert-manager.yaml
kubectl get pods -n cert-manager
kubectl get crd | grep cert-manager.io
类似生成一个证书的流程大致如下:
-
- 创建一个 ClusterIssuer
-
- 然后创建一个 root CA (Certificate Authority) :证书管理机构,即数字证书的申请、签发及管理机关。其主要功能为: 产生密钥对、生成数字证书、分发密钥、密钥管理等。
-
- 然后基于根证书创建一个 Issuer
-
- 最后生成证书
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: selfsigned-issuer
spec:
selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: my-ca
namespace: orthweb
spec:
isCA: true
commonName: my-ca
secretName: ca-secret
privateKey:
algorithm: ECDSA # 可以改为 RSA
size: 256 # RSA size 2048,4096
issuerRef:
name: selfsigned-issuer
kind: ClusterIssuer
group: cert-manager.io
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: my-ca-issuer
namespace: orthweb
spec:
ca:
secretName: ca-secret
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: orthweb-cert
namespace: orthweb
spec:
commonName: orthweb.com
secretName: orthweb-secret
duration: 2160h
renewBefore: 72h
subject:
organizations:
- digihunch
dnsNames:
- web.orthweb.com
- dcm.orthweb.com
privateKey:
algorithm: ECDSA
size: 256
issuerRef:
name: my-ca-issuer
kind: Issuer
group: cert-manager.io
最后查看生成的 (网站的)站点证书(site certificate)
kubectl -n orthweb get secret orthweb-secret -o jsonpath='{.data.ca\.crt}' | base64 -d
参考: