kubernetes-harbor镜像仓库使用自签https证书
HTTPS 的原理
大家可能都听说过 HTTPS 协议之所以是安全的是因为 HTTPS 协议会对传输的数据进行加密,而加密过程是使用了非对称加密实现。但其实,HTTPS 在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。
HTTPS的整体过程分为证书验证和数据传输阶段,具体的交互过程如下:
① 证书验证阶段
- 浏览器发起 HTTPS 请求
- 服务端返回 HTTPS 证书
- 客户端验证证书是否合法,如果不合法则提示告警
② 数据传输阶段
1.当证书验证合法后,在本地生成随机数
2.通过公钥加密随机数,并把加密后的随机数传输到服务端
3.服务端通过私钥对随机数进行解密
4.服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输
背景
工作中使用了harbor镜像仓库,因为要使用https,但是又没有购买权威机构CA的https证书,所以这里需要使用自签证书。
常规的我们总得配置docker或者containerd等加skip verfiy 参数,并不是无感,所以使用很不方便。而且还得需要client无感知的使用https。
实现
基于操作系统 anolis 8 x86_64
具体harbor安装步骤忽略,直接docker-compose启动就行
1. 生成证书
1.1 生成ca证书
生成自签权威机构证书,自己就是权威机构。
#openssl genrsa -out ca.key 4096
调整-subj选项中的值以反映您的组织。如果使用FQDN连接Harbor主机,则必须将其指定为通用名称(CN)属性。如果使用IP访问,如下命令相关域名换成IP即可。
#openssl req -x509 -new -nodes -sha512 -days 3650 \-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.domain.net" \-key ca.key \-out ca.crt
1.2 生成域名服务端证书
证书通常包含一个.crt文件和一个.key文件,证书有效期10年。
#openssl genrsa -out harbor.domain.net.key 4096
#openssl req -sha512 -new \-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.domain.net" \-key harbor.domain.net.key \-out harbor.domain.net.csr
生成一个x509 v3扩展文件,无论您使用FQDN还是IP地址连接到Harbor主机,都必须创建此文件,以便可以为您的Harbor主机生成符合主题备用名称(SAN)和x509 v3的证书扩展要求。替换DNS条目以反映您的域
#cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names[alt_names]
DNS.1=domain.net
DNS.2=registry.domain.net
DNS.3=harbor.domain.net
DNS.4=harbor.tob.domain.net
IP.1=10.253.94.54
IP.2=127.0.0.1
EOF
使用该v3.ext文件为您的Harbor主机生成证书
#openssl x509 -req -sha512 -days 3650 \-extfile v3.ext \-CA ca.crt -CAkey ca.key -CAcreateserial \-in harbor.domain.net.csr \-out harbor.domain.net.crt
2. harbor配置证书
harbor.yml
# https related config
https:# https port for harbor, default is 443port: 443# The path of cert and key files for nginxcertificate: /opt/harbor/certs/harbor.domain.net.crtprivate_key: /opt/harbor/certs/harbor.domain.net.key
3. client 操作系统级别信任
放入前面生成的ca证书,加到默认的信任列表
#vim /etc/pki/ca-trust/source/anchors/ca.crt
#update-ca-trust
PS: 当然也可以把ca证书放入docker/containerd自己目录下,这种自行配置一下就行。
通过curl等尝试https请求吧,直接curl https://harbor.domain.net 请求即可~
参考:
https://www.cnblogs.com/birkhoffxia/articles/17153652.html
https://blog.lweiqiang.xyz/archives/harbor-zi-zhi-httpszheng-shu
https://cloud.tencent.com/developer/article/1601995