开发kubernetes的webhook扩展程序之获取证书文件

摘要

本文章主要介绍开发k8s的webhook扩展程序是需要做的获取证书的流程,主要参考了一个webhook程序。是对该程序的自动生成脚本 webhook-create-signed-cert.sh的简单描述。

需要TLS验证的原因

  1. 首先API服务器与其他程序通信需要保证安全性,所以他们之间要https加密通信。
  2. webhook程序跟API服务器通信的时候可以理解为webhook程序是服务端,所以它要产生公私匙,将公匙交给客户端,让其加密后再发送数据。但是,客户端不知道服务端发公匙是不是伪造的,所以需要一个第三方机构CA进行证书签名。证书签名是使用CA的私匙加密,然后客户端用CA的公匙解密验证证书的真伪。

关于https和证书的相关知识

  • https连接的通信是加密的,建立连接的时候使用非对称加密,然后协商一个对称加密的密匙,之后使用对称加密的密匙进行加密通信。

  • 要产生证书,需要申请者产生私匙和CSR证书请求文件,发送CSR给CA获得证书。

  • CSR 即证书签名申请(Certificate Signning Request),获取 SSL 证书,需要先生成 CSR 文件并提交给证书颁发机构(CA)。证书申请者只要把CSR文件提交给证书颁发机构后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件。也就是用CA的私匙加密服务端的公匙。

开发k8s的webhook程序需要进行的证书验证步骤

webhook程序需要证书的目的
  • webhook程序作为api服务器的服务端,需要提供证书进行https通信。
  • 该证书由k8s自带的CA进行签名,因为这样api服务器就可以用自带CA的公匙进行验证。
  • 所以webhook程序要做的是获取一个经过api服务器根证书私匙加密的证书.
具体步骤
  1. 使用openssl等程序产生私匙和证书请求文件(包含公匙信息)。

  2. 将证书请求以资源的方式发送给k8s的api服务器。

apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
  name: ${csrName}
spec:
  groups:
  - system:authenticated
  request: $(cat $server.csr | base64 | tr -d '\n')
  usages:
  - digital signature
  - key encipherment
  - server auth

资源类型是CertificateSigningRequest,spec.request是证书请求文件包含的证书请求信息,需要base64编码。可以使用cat命令取出,tr -d '\n'是删除回车的作用。csrName是自定义的名字。

  1. 之后需要用kubectl命令是这个请求生效。kubectl certificate approve ${csrName}

  2. 从CertificateSigningRequest资源中提取证书内容kubectl get csr ${csrName} -o jsonpath='{.status.certificate}',然后保存到文件server.crt中,之后再用openssl生成.pem格式的文件即可。cat server.crt | openssl base64 -d -A -out server-cert.pem

    以上就是**生成一个可以用于跟k8s的api服务器加密通信的证书和私匙文件的流程 **,主要参考了一个webhook程序的自动生成脚本 webhook-create-signed-cert.sh。

你可能感兴趣的:(k8s)