龙空技术网

如何使用cert-manager管理网关的证书

散文随风想 83

前言:

现在大家对“openssl查看cert文件”大致比较看重,兄弟们都需要分析一些“openssl查看cert文件”的相关资讯。那么小编同时在网摘上汇集了一些对于“openssl查看cert文件””的相关文章,希望各位老铁们能喜欢,小伙伴们快快来学习一下吧!

cert-manager是一个证书生命周期管理系统,支持证书的申请、部署等功能。您可以使用cert-manager颁发ASM网关的证书,从而可以使用HTTPS协议通过ASM网关访问服务,保证数据传输的安全。本文介绍如何使用cert-manager管理网关的证书。

背景信息

cert-manager支持签发自签名证书和DNS域名证书,从而可以使用HTTPS协议通过ASM网关访问服务。这两种证书的区别如下:

自签名证书:自签名证书仅具有加密功能,无身份验证功能。您可以在命令行工具中使用HTTPS协议访问ASM网关,但是自签名证书不受Web浏览器的信任,Web浏览器检查HTTPS连接会标记为潜在风险并弹出错误消息,即无法在Web浏览器中使用HTTPS协议通过ASM网关访问服务。DNS域名证书:DNS域名证书由受信任的CA机构颁发,兼具加密和身份验证功能。相比自签名证书,DNS域名证书具有更高的安全性,受到Web浏览器的信任。您可以同时在命令行工具和Web浏览器中使用HTTPS协议通过ASM网关访问服务。在集群中安装cert-manager在本地安装Helm。

具体操作,请参见 Helm 。

使用kubectl连接集群。

具体操作,请参见 获取集群KubeConfig并通过kubectl工具连接集群 。

创建cert-manager命名空间

kubectl create namespace cert-manager
添加cert-manager Chart。
helm repo add jetstack 
获取cert-manager Chart的最新信息。
helm repo update
安装cert-manager。

说明 cert-manager的版本需要和Kubernetes版本保持兼容。关于cert-manager和Kubernetes版本的对应关系,请参见 Supported Releases 。

helm install \  cert-manager jetstack/cert-manager \  --namespace cert-manager \  --version v1.1.0 \  --set installCRDs=true
使用cert-manager签发自签名证书步骤一:在集群中生成自签证书创建 issuer.yaml 。
apiVersion: cert-manager.io/v1kind: Issuermetadata:  name: selfsignedspec:  selfSigned: {}---apiVersion: cert-manager.io/v1kind: Certificatemetadata:  name: istio-ingressgateway-certsspec:  isCA: true  duration: 2160h # 90d  secretName: istio-ingressgateway-certs  commonName: istio-ingressgateway-certs  subject:    organizations:    - cluster.local    - cert-manager  issuerRef:    name: selfsigned    kind: Issuer    group: cert-manager.io---apiVersion: cert-manager.io/v1kind: Issuermetadata:  name: istio-ingressgateway-certsspec:  ca:    secretName: istio-ingressgateway-certs
创建自签名CA来颁发工作负载证书。
kubectl apply -f issuer.yaml -n istio-system
查看证书。
$. kubectl get secret -n istio-system # 预期输出: NAME                                        TYPE                             DATA         AGEistio-ingressgateway-certs                  kubernetes.io/tls                3            68m
步骤二:添加证书和私钥挂载卷到入口网关登录 ASM控制台 ,在左侧导航栏,选择。在 网格管理 页面,单击目标实例名称,然后在左侧导航栏,选择。在 入口网关 页面的目标网关右侧,单击 查看YAML 。在 编辑 对话框,添加如下信息到 spec 字段。
  secretVolumes:    - mountPath: /etc/istio/ingressgateway-certs      name: ingressgateway-certs      secretName: istio-ingressgateway-certs

添加之后的YAML文件示例如下: 展开查看YAML

apiVersion: istio.alibabacloud.com/v1beta1kind: IstioGatewaymetadata:  name: ingressgateway  namespace: istio-systemspec:  clusterIds:    - c58638b491a5248669b59609e0a17****  cpu: {}  externalTrafficPolicy: Local  maxReplicas: 1  minReplicas: 1  ports:    - name: status-port      port: 15020      targetPort: 15020    - name: http2      nodePort: 31380      port: 80      targetPort: 80    - name: https      nodePort: 31390      port: 443      targetPort: 443    - name: tls      port: 15443      targetPort: 15443  replicaCount: 1  secretVolumes:    - mountPath: /etc/istio/ingressgateway-certs      name: ingressgateway-certs      secretName: istio-ingressgateway-certs  serviceAnnotations:    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: slb.s1.small  serviceType: LoadBalancer
步骤三:在集群中检查入口网关配置

添加证书和私钥挂载卷到入口网关后,入口网关会加载证书与密钥。

验证 tls.crt 与 tls.key

执行以下命令,验证 tls.crt 与 tls.key 已被挂载到入口网关Pod中。

kubectl exec -it -n istio-system $(kubectl -n istio-system get pods -l istio=ingressgateway -o jsonpath='{.items[0].metadata.name}') -- ls -al /etc/istio/ingressgateway-certs

预期输出:

lrwxrwxrwx 1 root root   14 May  9 01:14 tls.crt -> ..data/tls.crtlrwxrwxrwx 1 root root   14 May  9 01:14 tls.key -> ..data/tls.key
检查Ingress gateway证书

执行以下命令,检查Ingress gateway证书中的 Subject 字段的正确性。

kubectl exec -it -n istio-system $(kubectl -n istio-system get pods -l istio=ingressgateway -o jsonpath='{.items[0].metadata.name}')  -- cat /etc/istio/ingressgateway-certs/tls.crt | openssl x509 -text -noout | grep 'Subject:'

预期输出:

Subject: O = cert-manager + O = cluster.local, CN = istio-ingressgateway-certs
检查Ingress gateway代理

执行以下命令,检查Ingress gateway的代理能够正确访问证书。

kubectl exec -it -n istio-system $(kubectl -n istio-system get pods -l istio=ingressgateway -o jsonpath='{.items[0].metadata.name}') -- curl  127.0.0.1:15000/certs

预期输出:

{ "certificates": [  {   "ca_cert": [    {     "path": "\u003cinline\u003e",     "serial_number": "4edcf3",     "subject_alt_names": [],     "days_until_expiration": "7251",     "valid_from": "2022-01-06T06:17:00Z",     "expiration_time": "2042-01-01T06:22:03Z"    }   ],...........
步骤四:验证使用HTTPS协议访问服务是否成功在集群中创建服务。创建 myexample-nginx.conf

使用以下内容,创建 myexample-nginx.conf 。 本文示例服务基于Nginx实现,您需要为Nginx服务器创建配置文件,以域名 aliyun.com 的服务为例,以下内容定义请求根路径直接返回字样 Welcome to aliyun.com! 及状态码 200

events {}http {  log_format main '$remote_addr - $remote_user [$time_local]  $status '  '"$request" $body_bytes_sent "$http_referer" '  '"$http_user_agent" "$http_x_forwarded_for"';  access_log /var/log/nginx/access.log main;  error_log  /var/log/nginx/error.log;  server {    listen 80;    location / {        return 200 'Welcome to aliyun.com!';        add_header Content-Type text/plain;    }  }}
创建Nginx服务器的配置项。
kubectl create configmap \myexample-nginx-configmap \--from-file=nginx.conf=./myexample-nginx.conf
启用Sidecar自动注入

执行以下命令,为命名空间default启用Sidecar自动注入。

kubectl label namespace default istio-injection=enabled
创建 myexampleapp.yaml 。
apiVersion: v1kind: Servicemetadata:  name: myexampleapp  labels:    app: myexampleappspec:  ports:  - port: 80    protocol: TCP  selector:    app: myexampleapp---apiVersion: apps/v1kind: Deploymentmetadata:  name: myexampleappspec:  selector:    matchLabels:      app: myexampleapp  replicas: 1  template:    metadata:      labels:        app: myexampleapp    spec:      containers:      - name: nginx        image: nginx        ports:        - containerPort: 80        volumeMounts:        - name: nginx-config          mountPath: /etc/nginx          readOnly: true      volumes:      - name: nginx-config        configMap:          name: myexample-nginx-configmap
创建域名为 aliyun.com 的内部服务。
kubectl apply -f myexampleapp.yaml
通过kubectl连接ASM。

具体操作,请参见 通过控制面kubectl访问Istio资源 。

在ASM中创建网关规则。创建 istio-myexample-customingressgateway.yaml 。

apiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata:  name: istio-myexample-customingressgatewayspec:  selector:    istio: ingressgateway  servers:  - hosts:    - '*.aliyun.com'    port:      name: http      number: 80      protocol: HTTP    tls:      httpsRedirect: true  - hosts:    - '*.aliyun.com'    port:      name: https      number: 443      protocol: HTTPS    tls:      mode: SIMPLE      privateKey: /etc/istio/ingressgateway-certs/tls.key      serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
执行以下命令,创建网关规则。
kubectl apply -f istio-myexample-customingressgateway.yaml
在ASM中创建虚拟服务。创建 istio-myexample-customvirtualservice.yaml 。
apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:  name: istio-myexample-customvirtualservicespec:  hosts:  - ";  gateways:  - istio-myexample-customingressgateway  http:  - route:    - destination:        host: myexampleapp.default.svc.cluster.local        port:          number: 80
执行以下命令,创建虚拟服务。
kubectl apply -f istio-myexample-customvirtualservice.yaml
在集群中获取入口网关服务的地址。
kubectl get svc -n istio-system -l istio=ingressgateway
通过HTTPS协议访问aliyun.com服务。
curl -k -H Host: --resolve :{替换成真实的入口网关IP地址}  

预期输出:

Welcome to aliyun.com!

标签: #openssl查看cert文件