Please enable Javascript to view the contents

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

 ·  ☕ 2 分钟

在之前的文章 使用 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

最终在目录下得到如下文件:

1
2
3
ls

ca.crt  ca.key  ca.srl  harbor.dev.chenshaowen.com.cert  harbor.dev.chenshaowen.com.crt  harbor.dev.chenshaowen.com.csr  harbor.dev.chenshaowen.com.key  v3.ext

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

如果没有默认的 storageClass 可以将 persistence.enabled 设置为 false ,不使用持久化存储。

如果需要使用持久化存储可以参考文档,使用 StorageClass 提供 PV 动态存储

3. 配置及使用

3.1 页面访问

配置 hosts 之后,通过 https://core.harbor.dev.chenshaowen.com 访问:

这是因为自签的证书不被信任。我们需要将 harbor.dev.chenshaowen.com.crt 证书导入系统,下面以 OS X 系统为例:

将证书保存一份到本地,拖拽到 Keychain 中,然后双击证书,设置为 Always Trust 。如下图:

再次访问时,就可以正常打开页面登陆。

3.2 Docker 访问

  • 将拷贝证书至 Docker 的证书配置目录
1
2
3
4
mkdir -p /etc/docker/certs.d/core.harbor.dev.chenshaowen.com/
cp harbor.dev.chenshaowen.com.cert /etc/docker/certs.d/core.harbor.dev.chenshaowen.com/
cp harbor.dev.chenshaowen.com.key /etc/docker/certs.d/core.harbor.dev.chenshaowen.com/
cp ca.crt /etc/docker/certs.d/core.harbor.dev.chenshaowen.com/

这里的 core.harbor.dev.chenshaowen.com 目录一定要与服务保持一致,如果有端口,也应该用 : 连接带上。

  • 登陆 core.harbor.dev.chenshaowen.com
1
2
3
4
5
6
7
8
docker login core.harbor.dev.chenshaowen.com -u admin

Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
  • 推送镜像
1
docker tag nginx core.harbor.dev.chenshaowen.com/library/nginx
1
2
3
4
5
6
7
docker push  core.harbor.dev.chenshaowen.com/library/nginx

The push refers to repository [core.harbor.dev.chenshaowen.com/library/nginx]
be91fceb796e: Pushed
919b6770519b: Pushed
b60e5c3bcef2: Pushed
latest: digest: sha256:6b3b6c113f98e901a8b1473dee4c268cf37e93d72bc0a01e57c65b4ab99e58ee size: 948
  • 页面查看推送的镜像

由于推送之后,我又删除本地镜像,再次拉取,这里的下载次数为 1 。


微信公众号
作者
微信公众号