部署Harbor或者二进制方式部署Kubernetes均需要创建自签名证书,本文给出2种常用的创建自签名证书的方式。

以创建部署Harbor所需的自签名证书为例。

基于CFSSL工具生成自签名证书 安装CFSSL wget -O /bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 wget -O /bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 wget -O /bin/cfssl-certinfo https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64

for cfssl in ls /bin/cfssl*; do chmod +x $cfssl; done; 准备自签名根证书 X.509证书包含三个文件:key,csr,crt:

  • csr

Certificate Signing Request,即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,用于提交给证书颁发机构(CA)对证书进行签名的;其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好。

  • key

是服务器上的私钥文件,用于对发送给客户端数据的加密,以及对从客户端接收到数据的解密。

  • crt

是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息。

创建证书存放目录 mkdir -pv /root/harbor/cert

cd /root/harbor/cert 生成自签名根证书配置文件 根据自己的需要自定义ca-config.json,修改为如下配置:

[kevin@linuxfdc cert]$ cat > ca-config.json << EOF { "signing": { "default": { "expiry": "8760h" }, "profiles": { "harbor": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "8760h" } } } } EOF 这个策略,有一个default默认的配置,和一个profiles,profiles可以设置多个profile,这里的profile是harbor。

  • default

默认策略,指定了证书的默认有效期是一年(8760h);

  • harbor

表示该配置(profile)的用途是为harbor生成证书及相关的校验工作;

  • signing

表示该证书可用于签名其它证书;生成的ca.pem证书中CA=TRUE;

  • server auth

表示可以用该CA对server提供的证书进行验证;

  • client auth

表示可以用该CA对client提供的证书进行验证;

  • expiry

也表示过期时间,如果不写以default中的为准。

生成自签名根证书请求文件 [root@K8S-HARBOR cert]# cat > ca-csr.json << EOF { "CN": "harbor.cluster.local", "key": { "algo": "rsa", "size": 2048 }, "names": [{ "C": "CN", "ST": "Shaanxi", "L": "Xi'an", "O": "Harbor", "OU": "Harbor Security" }] } EOF 参数介绍:

  • CN

Common Name,浏览器使用该字段验证网站是否合法,一般写的是域名。

  • key

生成证书的算法;

  • hosts

表示哪些主机名(域名)或者IP可以使用此csr申请的证书,为空或者""表示所有的都可以使用;

  • names

一些其它的属性:

  • C: Country,国家
  • ST: State,州或者是省份
  • L: Locality Name,地区,城市
  • O: Organization Name,组织名称,公司名称(在K8S中常用于指定* Group,进行RBAC绑定)
  • OU: Organization Unit Name,组织单位名称,公司部门 生成自签名根证书 [root@K8S-HARBOR cert]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
    2020/09/08 16:38:48 [INFO] generating a new CA key and certificate from CSR 2020/09/08 16:38:48 [INFO] generate received request 2020/09/08 16:38:48 [INFO] received CSR 2020/09/08 16:38:48 [INFO] generating key: rsa-2048 2020/09/08 16:38:49 [INFO] encoded CSR 2020/09/08 16:38:49 [INFO] signed certificate with serial number 262743830065161790985636603005551175222856124160

[root@K8S-HARBOR cert]# ll total 24 -rw-r--r-- 1 10000 kevin 310 Sep 8 16:30 ca-config.json -rw-r--r-- 1 root root 1029 Sep 18 15:18 ca.csr -rw-r--r-- 1 10000 kevin 246 Sep 18 15:15 ca-csr.json -rw------- 1 root root 1679 Sep 18 15:18 ca-key.pem -rw-r--r-- 1 root root 1411 Sep 18 15:18 ca.pem 该命令会生成运行CA所必需的文件ca-key.pem(私钥)和ca.pem(证书),还会生成ca.csr(证书签名请求),用于交叉签名或重新签名。

转换成CRT格式 将ca.pem转换为ca.crt。格式区别:

  • .crt:是用于存放证书,它是2进制形式存放的,不含私钥。
  • .pem:跟crt的区别是它以ASCII来表示的,可查看。
  • [root@K8S-HARBOR cert]# openssl x509 -outform der -in ca.pem -out ca.crt 基于这种方式生成的CRT文件在使用openssl命令校验时将失败,可通过修改后缀的方式生成CRT文件,如:

[root@K8S-HARBOR cert]# cp ca.pem ca.crt 校验证书信息

  • 查看cert(证书信息)

输出信息JSON格式

[root@K8S-HARBOR cert]# cfssl certinfo -cert ca.pem

输出信息被格式化

[root@K8S-HARBOR cert]# openssl x509 -noout -text -in ca.pem 针对输出信息,说明:

  • 确认 Issuer 字段的内容和 ca-csr.json 一致;
  • 确认 Subject 字段的内容和客户端请求文件如下面的 ca-csr.json 一致。
  • 查看CSR(证书签名请求)信息

[root@K8S-HARBOR cert]# cfssl certinfo -csr ca.csr 示例:生成自签名证书 以创建部署Harbor所需的自签名证书为例。

创建证书签署请求 [root@K8S-HARBOR cert]# cat > harbor-csr.json << EOF { "CN": "harbor.cluster.local", "hosts": [ "local", "cluster.local", "harbor.cluster.local" ], "key": { "algo": "rsa", "size": 2048 }, "names": [{ "C": "CN", "ST": "Shaanxi", "L": "Xi'an", "O": "Harbor", "OU": "Harbor Security" }] } EOF 基于根证书签署请求 [root@K8S-HARBOR cert]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=harbor harbor-csr.json | cfssljson -bare harbor 2020/09/18 15:38:18 [INFO] generate received request 2020/09/18 15:38:18 [INFO] received CSR 2020/09/18 15:38:18 [INFO] generating key: rsa-2048 2020/09/18 15:38:19 [INFO] encoded CSR 2020/09/18 15:38:19 [INFO] signed certificate with serial number 160381788685832694502009193205750931266964565823 2020/09/18 15:38:19 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for websites. For more information see the Baseline Requirements for the Issuance and Management of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org); specifically, section 10.2.3 ("Information Requirements"). 验证自签名的证书信息 [root@K8S-HARBOR cert]# ll total 40 -rw-r--r-- 1 10000 kevin 310 Sep 8 16:30 ca-config.json -rw-r--r-- 1 root root 1002 Sep 18 15:21 ca.crt -rw-r--r-- 1 root root 1029 Sep 18 15:18 ca.csr -rw-r--r-- 1 10000 kevin 246 Sep 18 15:15 ca-csr.json -rw------- 1 root root 1679 Sep 18 15:18 ca-key.pem -rw-r--r-- 1 root root 1411 Sep 18 15:18 ca.pem -rw-r--r-- 1 root root 1127 Sep 18 15:38 harbor.csr -rw-r--r-- 1 10000 kevin 341 Sep 18 15:15 harbor-csr.json -rw------- 1 root root 1679 Sep 18 15:38 harbor-key.pem -rw-r--r-- 1 root root 1525 Sep 18 15:38 harbor.pem

[root@K8S-HARBOR cert]# openssl x509 -in harbor.pem -text -noout 基于OpenSSL工具生成自签名证书 操作流程

图片来自往网络。

更新工具版本 系统默认安装的版本是:OpenSSL 1.0.2k

获取安装包

wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz tar -xzvf /tmp/openssl-1.1.0h.tar.gz cd openssl-1.1.0h

本地构建

./config --prefix=/usr/local/openssl make make install

执行配置

mv /usr/bin/openssl /usr/bin/openssl.bak ln -sf /usr/local/openssl/bin/openssl /usr/bin/openssl echo "/usr/local/openssl/lib" >> /etc/ld.so.conf ldconfig -v

检验版本

openssl version OpenSSL 1.1.0h 27 准备自签名根证书 创建证书存放目录 [root@K8S-HARBOR ssl]# mkdir -pv /root/harbor/cert/ssl && cd /root/harbor/cert/ssl 创建自签名根证书

  • 生成根证书私钥

注意其权限应该为400以阻止其他用户随意获取。

[root@K8S-HARBOR ssl]# (umask 077; openssl genrsa -out ca-key.pem 2048)

  • 生成根证书请求文件

[root@K8S-HARBOR ssl]# openssl req -new -key ca-key.pem -out ca.csr -subj "/CN=harbor.cluster.local"

-new:表示生成一个新的证书签署请求

  • 创建自签名根证书文件

[root@K8S-HARBOR ssl]# openssl x509 -req -in ca.csr -out ca.crt -signkey ca-key.pem -days 365 Signature ok subject=/CN=harbor.cluster.local Getting Private key

  • 验证自签名根证书信息

[root@K8S-HARBOR ssl]# openssl x509 -in ca.crt -text -noout 示例:生成自签名证书 生成私钥文件 注意其权限应该为600以阻止其他用户随意获取。

[root@K8S-HARBOR ssl]# (umask 077; openssl genrsa -out harbor-key.pem 2048) 创建证书签署请求 [root@K8S-HARBOR ssl]# openssl req -new -key harbor-key.pem -out harbor.csr -subj "/CN=harbor.cluster.local/O=Harbor" 基于根证书签署请求 [root@K8S-HARBOR ssl]# openssl x509 -req -in harbor.csr -CA ca.crt -CAkey ca-key.pem -CAcreateserial -out harbor.crt -days 365 Signature ok subject=/CN=harbor.cluster.local/O=Harbor Getting CA Private Key 参数项说明:

主要选项:

-in filename: #指定证书输入文件,若同时指定了"-req"选项,则表示输入文件为证书请求文件。 -out filename: #指定输出文件 -md2|-md5|-sha1|-mdc2: #指定单向加密的算法。

查看证书选项:

-text: 以text格式输出证书内容,即以最全格式输出, : 包括public key,signature algorithms,issuer和subject names,serial number以及any trust settings. -certopt option: 自定义要输出的项 -noout: 禁止输出证书请求文件中的编码部分 -pubkey: 输出证书中的公钥 -modulus: 输出证书中公钥模块部分 -serial: 输出证书的序列号 -subject: 输出证书中的subject -issuer: 输出证书中的issuer,即颁发者的subject -subject_hash: 输出证书中subject的hash码 -issuer_hash: 输出证书中issuer(即颁发者的subject)的hash码 -hash: 等价于"-subject_hash",但此项是为了向后兼容才提供的选项 -email: 输出证书中的email地址,如果有email的话 -startdate: 输出证书有效期的起始日期 -enddate: 输出证书有效期的终止日期 -dates: 输出证书有效期,等价于"startdate+enddate" -fingerprint: 输出指纹摘要信息 -signkey filename: 该选项指定签名秘钥(秘钥必须是输入文件的私钥),并使得由-in提供的输入文件转成自签名的证书。

  • in: 自签署的输入文件"-in file"的file可以是证书请求文件,也可以是已签署过的证书。会使用文件中的subject name 作为issuer name. -x509toreq: 将已签署的证书转换回证书请求文件。需要使用"-signkey"选项来传递需要的私钥。 -req: x509工具默认以证书文件做为inputfile(-in file),指定该选项将使得input file的file为证书请求文件。 -set_serial n: 指定证书序列号。该选项可以和"-singkey"或"-CA"选项一起使用。 : 如果和"-CA"一起使用,则"-CAserial"或"-CAcreateserial"选项指定的serial值将失效。 : 序列号可以使用数值或16进制值(0x开头)。也接受负值,但是不建议。 -CA filename: 指定签署时所使用的CA证书。该选项一般和"-req"选项一起使用,用于为证书请求文件签署。 -CAkey filename: 设置CA签署时使用的私钥文件。如果该选项没有指定,将假定CA私钥已经存在于CA自签名的证书文件中。 -CAserial filename: 设置CA使用的序列号文件。当使用"-CA"选项来签名时,它将会使用某个文件中指定的序列号来唯一标识此次签名后的证书文件。 : 这个序列号文件的内容仅只有一行,这一行的值为16进制的数字。当某个序列号被使用后,该文件中的序列号将自动增加。 : 默认序列号文件以CA证书文件基名加".srl"为后缀命名。如CA证书为"mycert.pem",则默认寻找的序列号文件为"mycert.srl" -CAcreateserial: 当使用该选项时,如果CA使用的序列号文件不存在将自动创建:该文件将包含序列号值"02"并且此次签名后证书文件序列号为1。 : 一般如果使用了"-CA"选项而序列号文件不存在将会产生错误"找不到srl文件"。

证书扩展选项: -purpose: 选项检查证书的扩展项并决定该证书允许用于哪些方面,即证书使用目的范围。 验证自签名的证书信息 [root@K8S-HARBOR ssl]# ll total 28 -rw------- 1 root root 1005 Jan 11 16:26 ca.crt -rw------- 1 root root 907 Jan 11 16:24 ca.csr -rw------- 1 root root 1675 Jan 11 16:19 ca-key.pem -rw------- 1 root root 17 Jan 11 16:59 ca.srl -rw------- 1 root root 1029 Jan 11 16:59 harbor.crt -rw------- 1 root root 928 Jan 11 16:59 harbor.csr -rw------- 1 root root 1679 Jan 11 16:58 harbor-key.pem

[root@K8S-HARBOR ssl]# openssl x509 -in harbor.crt -text -noout