Harbor 使用自签证书支持 Https 访问

在之前的文章 使用 Helm 安装 harbor 中,我已经详细描述了安装 Ingress 、Harbor ,最后成功推送镜像的步骤。其中的域名是公网可以访问的,证书是认证机构签发的。但是在内网环境下,我们需要使用内网域名进行访问。本文主要解决使用自签证书通过 Https 访问 Harbor 的问题。

1. 生成自签证书

这里以 *.harbor.dev.chenshaowen.com 域名为例。

1.1 创建 CA 证书

  • 生成 CA 证书私钥
1
openssl genrsa -out ca.key 4096
  • 生成 CA 证书
1
2
3
4
openssl req -x509 -new -nodes -sha512 -days 3650 
 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=dev.chenshaowen.com" 
 -key ca.key 
 -out ca.crt

1.2 创建域名证书

  • 生成私钥
1
openssl genrsa -out harbor.dev.chenshaowen.com.key 4096
  • 生成证书签名请求 CSR
1
2
3
4
openssl req -sha512 -new 
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=*.harbor.dev.chenshaowen.com" 
    -key harbor.dev.chenshaowen.com.key 
    -out harbor.dev.chenshaowen.com.csr
  • 生成 x509 v3 扩展
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=harbor.dev.chenshaowen.com
DNS.2=*.harbor.dev.chenshaowen.com
DNS.3=hostname
EOF
  • 创建 Harbor 访问证书
1
2
3
4
5
openssl x509 -req -sha512 -days 3650 
    -extfile v3.ext 
    -CA ca.crt -CAkey ca.key -CAcreateserial 
    -in harbor.dev.chenshaowen.com.csr 
    -out harbor.dev.chenshaowen.com.crt
  • 将 crt 转换为 cert ,以供 Docker 使用
1
openssl x509 -inform PEM -in harbor.dev.chenshaowen.com.crt -out harbor.dev.chenshaowen.com.cert

2. 部署 Harbor

  • 安装 Ingress Controller
1
helm install --name nginx-ingress --set "rbac.create=true,controller.service.externalIPs[0]=192.168.13.20" stable/nginx-ingress
  • 创建 Namespace
1
kubectl create ns harbor
  • 创建证书秘钥
1
kubectl create secret tls harbor.dev.chenshaowen.com --key harbor.dev.chenshaowen.com.key --cert harbor.dev.chenshaowen.com.crt -n harbor
  • 添加 Chart 库
1
2
helm repo add harbor https://helm.goharbor.io
helm repo update
  • 安装 Harbor
1
2
3
4
5
6
7
helm install --name harbor --namespace harbor harbor/harbor 
  --set expose.ingress.hosts.core=core.harbor.dev.chenshaowen.com 
  --set expose.ingress.hosts.notary=notary.harbor.dev.chenshaowen.com 
  --set expose.tls.secretName=harbor.dev.chenshaowen.com 
  --set persistence.enabled=true 
  --set externalURL=https://core.harbor.dev.chenshaowen.com 
  --set harborAdminPassword=Harbor12345