本文已参与「开源摘星计划」,欢迎正在阅读的你加入。 活动链接:​ ​https://github.com/weopenprojects/WeOpen-Star [文章来源]:《Harbor进阶实战》公众号


前言

  Harbor支持HTTP和HTTPS两种服务访问方式,HTTPS作为安全访问协议,则需要配置相关的证书才可以进行访问。
  从官方文档的部署过程可以看到,其使用的是Openssl工具为Harbor颁发HTTPS安全证书。
   本文则另辟蹊径的以cfssl证书工具为Harbor颁发证书。

环境及注意事项

本文以离线安装方式安装2.3.5版本的Harbor,操作系统为CentOS 7.6; 安装目录则为/app/harbor/

注意事项: 为便于后期Harbor的维护,建议将相关的证书放到Harbor的安装目录的ssl子目录下,在备份Harbor数据的时候一起进行备份。

  • 创建证书存放目录
$ mkdir /app/harbor/ssl

一、cfssl简介

  • 官网:https://cfssl.org/
  • 项目地址:https://github.com/cloudflare/cfssl

   CFSSL是CloudFlare公司提供的PKI/TLS工具,使用Go语言开发。开源并支持Windows、Linux、macos系统。

工具集:

multirootca:管理多个签名密钥的情形;使用多个签名密钥的证书颁发机构服务器。
mkbundle:构建证书池;
cfssljson:将从cfssl和multirootca等获得的json格式的输出转化为证书格式的文件(证书,密钥,CSR和bundle)进行存储;
cfssl-certinfo:可显示CSR或证书文件的详细信息,可用于证书校验。 cfssljson:将从cfssl和multirootca等获得的json格式的输出转化为证书格式的文件(证书,密钥,CSR和bundle)进行存储;
cfssl-certinfo:可显示CSR或证书文件的详细信息;可用于证书校验。

文件说明

  • ca-config.json: 配置文件;
  • ca-csr.json:证书请求文件;
  • xxx-ca.csr:应用证书签名请求文件;
  • xxx-ca.pem:应用服务公钥;
  • xxx-key.pem:应用服务私钥;

<br/>


二、安装cfssl证书管理工具

下载cfssl二进制文件

   在线安装,离线安装到官网下载安装包即可。 下载二进制可执行文件并放入到/usr/local/bin/下

$ wget -c https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssl_1.6.0_linux_amd64 -O /usr/local/bin/cfssl
$ wget -c https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssljson_1.6.0_linux_amd64 -O /usr/local/bin/cfssljson
$ wget -c https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssl-certinfo_1.6.0_linux_amd64 -O /usr/local/bin/cfssl-certinfo

下载时默认没有可执行权限,所以得给这几个工具执行权限:

$ chmod +x  /usr/local/bin/cfssl*

三、生成证书颁发机构证书(CA)

  自建CA证书颁发机构,使用刚才安装好的cfssl工具为harbor制作颁发证书。

3.1 生成并修改CA默认配置文件

$ cfssl print-defaults  config > /app/harbor/ssl/ca-config.json            #生成默认配置文件
$ cat <<EOF > /app/harbor/ssl/ca-config.json
{
    "signing": {
        "default": {
            "expiry": "87600h"  
        },
        "profiles": {
            "harbor": {
                "expiry": "87600h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}
EOF

参数解析:
default.expiry:默认证书有效期(单位:h)
profiles.harbor:为服务使用该配置文件颁发证书的配置模块;
signing:签署,表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
key encipherment:密钥加密;
profiles:指定了不同角色的配置信息;可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile。
server auth:服务器身份验证;表示 client 可以用该 CA 对 server 提供的证书进行验证;
client auth:客户端身份验证;表示 server 可以用该 CA 对 client 提供的证书进行验证;

3.2 生成并修改默认csr请求文件

$ cfssl  print-defaults csr  > /app/harbor/ssl/ca-csr.json
$ cat <<EOF > ca-csr.json
{
    "CN": "harbor",
    "hosts": [
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "Beijing",
            "L": "Beijing"
        }
    ]
}
EOF

参数解析:
hosts:包含的授权范围,不在此范围的的节点或者服务使用此证书就会报证书不匹配错误,证书如果不包含可能会出现无法连接的情况(此处是CA机构的可为空);
Key: 指定使用的加密算法,一般使用rsa非对称加密算法(algo:rsa;size:2048)
CN:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
CN:域名,也就是你现在使用什么域名就写什么域名;
O:Organization,从证书中提取该字段作为请求用户所属的组 (Group);

<br/>

3.3 初始化CA证书

$ cfssl gencert -initca /app/harbor/ssl/ca-csr.json | cfssljson -bare /app/harbor/ssl/ca 
2022/08/05 17:45:13 [INFO] generating a new CA key and certificate from CSR
2022/08/05 17:45:13 [INFO] generate received request
2022/08/05 17:45:13 [INFO] received CSR
2022/08/05 17:45:13 [INFO] generating key: rsa-2048
2022/08/05 17:45:13 [INFO] encoded CSR
2022/08/05 17:45:13 [INFO] signed certificate with serial number 569300079190788296339255431042064535929535986620
$ ls /app/harbor/ssl/
ca-config.json  ca.csr  ca-csr.json  ca-key.pem  ca.pem

可以看到,当前目录下新生成了ca.csr、ca-key.pem、ca.pem这3个文件。ca-key.pem、ca.pem这两个是CA相关的证书,通过这个CA来向Harbor颁发证书。


四、CA给Harbor颁发证书

  Harbor使用类似于申请表的一个请求文件向CA机构申请证书,CA机构则根据配置文件(证书策略)和请求文件(申请表)向Harbor颁发证书。

4.1 创建并修改Harbor证书请求文件

  使用以下命令创建一个默认的请求文件,但默认的部分参数需要修改。

$ cfssl print-defaults csr > /app/harbor/ssl/harbor-csr.json
$ cat <<EOF > /app/harbor/ssl/harbor-csr.json
{
    "CN": "192.168.2.22",  #Harbor主机IP
    "hosts": [],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "Beijing",
            "L": "Beijing"
        }
    ]
}
EOF

4.2 CA向Harbor颁发证书

  CA使用请求文件根据配置向Harbor颁发证书。

$ cfssl gencert -ca=/app/harbor/ssl/ca.pem \
-ca-key=/app/harbor/ssl/ca-key.pem \
-config=/app/harbor/ssl/ca-config.json \
-profile=harbor  harbor-csr.json | cfssljson -bare  /app/harbor/ssl/harbor 
$ ls /app/harbor/ssl/
ca-config.json  ca.csr  ca-csr.json  ca-key.pem  ca.pem  harbor.csr  harbor-csr.json  harbor-key.pem  harbor.pem
$ cp harbor.pem harbor-key.pem  /app/harbor/ssl/

参数解析:
-config:指定CA证书机构的配置文件;
-profile:指定使用CA配置文件中的哪个模块(此处harbor对应配置文件中的harbor);
harbor.pem:harbor服务的数字证书;
harbor-key.pem:harbor服务的私钥;


五、Harbor配置文件中指定证书

5.1 修改配置文件

  修改Habor.yml配置文件,在对应参数指定使用的证书文件。

$ vim /app/harbor/harbor.yml
hostname: 192.168.2.22   #本机IP或域名
http:
  port: 80
https:       #启用https安全访问
  port: 443    #Https安全端口(默认443)
  certificate: /app/harbor/ssl/harbor.pem    #Harbor的证书
  private_key: /app/harbor/ssl/harbor-key.pem  #Harbor的证书私钥

  关于Harbor配置文件每个参数的详细含义,可查看官方文档,或可在【Harbor进阶实战】微信公众号找到,本处仅修改必须的参数。

注意事项:
如果是在Harbor安装完成后才在配置文件中修改这几行参数,在修改参数后,需要先停止harbor,再执行./prepare使配置生效,最后执行./install.sh。

5.2 浏览器登录Harbor UI

  在浏览器地址栏输入:https://harbor-ip:443, 即可访问Harbior UI。