Linux机器配置信任Harbor自签名ssl证书

Linux机器配置信任Harbor自签名ssl证书

Harbor 是一个流行的开源容器镜像仓库,它支持容器镜像的存储、签名、扫描和复制功能。为了确保与 Harbor 的通信是安全的,通常会为其配置 SSL/TLS。然而,为了避免购买证书或简化部署过程,很多人在部署 Harbor 时选择使用自签名证书。

配置 Linux 机器以信任 Harbor 的自签名 SSL 证书有以下好处:

  1. 安全通信:SSL/TLS 证书确保与 Harbor 服务器之间的通信是加密的,从而避免了潜在的窃听和中间人攻击。
  2. 无错误和警告:如果你的工具(如 Docker、containerd 或其他与 Harbor 交互的工具)不信任该证书,你通常会看到错误或警告消息,表明证书是不受信任的。配置机器以信任自签名证书后,这些消息将不再出现。
  3. 节省成本:虽然受信任的证书颁发机构(如 Let’s Encrypt)提供免费的证书,但在某些内部网络或私有云环境中,与外部服务通信可能是一个挑战。在这种情况下,自签名证书提供了一种简便的方法来加密通信,而不需要与外部实体交互。

接下来我会给安装好的Harbor仓库设置ssl自签名证书,并在安装docker的机器和以containerd作为CRI的k8s集群中设置自签名证书的信任,从而确保拉取Harbor仓库的镜像时不报"x509"相关的错误。

1. Harbor集群设置自签名ssl证书

如果不了解如何安装Harbor仓库,请参考:Kubernetes安装Harbor仓库

通过上述方式安装的Harbor仓库Nginx Ingress映射出来的域名为"harbor.example.com",接下来需要为这个域名签发自签名ssl证书,相关签发方式请参考:Configure HTTPS Access to Harbor

我的签发命令为:

# Generate a Certificate Authority Certificate
openssl genrsa -out ca.key 4096

openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=GuangDong/L=GuangZhou/O=Yiqi/OU=Personal/CN=harbor.example.com" \
 -key ca.key \
 -out ca.crt
 
# Generate a Server Certificate
openssl genrsa -out domain.key 4096

openssl req -sha512 -new \
 -subj "/C=CN/ST=GuangDong/L=GuangZhou/O=Yiqi/OU=Personal/CN=harbor.example.com" \
 -key domain.key \
 -out domain.csr

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.example.com
DNS.2=harbor.example
DNS.3=yiqi.centos.com
EOF

openssl x509 -req -sha512 -days 3650 \
 -extfile v3.ext \
 -CA ca.crt -CAkey ca.key -CAcreateserial \
 -in domain.csr \
 -out domain.crt

接下来需要将ssl证书配置到ingress中

# 生成tls类型的secret
kubectl create secret -n har generic myharbor-ingress --from-file=ca.crt=ca.crt --from-file=tls.crt=domain.crt --from-file=tls.key=domain.key

# 查看Harbor ingress配置
kubectl get ing -n har
NAME                    CLASS   HOSTS                ADDRESS        PORTS     AGE
harbor-ingress          nginx   harbor.example.com   172.16.80.22   80, 443   91d
harbor-ingress-notary   nginx   notary.example.com   172.16.80.22   80, 443   91d

# 修改ingress tls使用的secret,在spec.tls.hosts栏位下
  tls:
  - hosts:
    - harbor.example.com
    secretName: myharbor-ingress # 修改为之前生成的tls类型的secret

完成后可以通过Chrome浏览器登录查看证书,可以看到虽然Chrome浏览器依然会提示证书不安全,由于不是通过授信的ca机构签发的证书。但是我们自签名证书的信息已经能看到了。到这里就代表"Harbor集群设置自签名ssl证书"已经成功。
在这里插入图片描述

2. 为Linux机器设置证书授信

不同的 Linux 发行版中信任自签名证书的方法可能会有所不同。以下是一些常见 Linux 发行版的指导:

  1. Debian/Ubuntu:

    • 将你的证书复制到 /usr/local/share/ca-certificates/:
      sudo cp your-cert.crt /usr/local/share/ca-certificates/
      
    • 更新证书列表:
      sudo update-ca-certificates
      
  2. RHEL/Fedora/CentOS:

    • 将你的证书复制到 /etc/pki/ca-trust/source/anchors/:
      sudo cp your-cert.crt /etc/pki/ca-trust/source/anchors/
      
    • 更新证书列表:
      sudo update-ca-trust
      
  3. openSUSE/SUSE:

    • 将你的证书复制到 /etc/pki/trust/anchors/:
      sudo cp your-cert.crt /etc/pki/trust/anchors/
      
    • 更新证书列表:
      sudo update-ca-certificates
      
  4. Alpine Linux:

    • 将你的证书复制到 /etc/ssl/certs/:
      sudo cp your-cert.crt /etc/ssl/certs/
      
    • 更新证书列表:
      sudo update-ca-certificates
      
2.1 Docker所在机器添加证书信任

使用如下命令尝试pull Harbor仓库中公开的镜像,可以看到由于仓库不授信无法拉取镜像。

docker pull harbor.example.com/library/nginx@sha256:01ccf4035840dd6c25042b2b5f6b09dd265b4ed5aa7b93ccc4714027c0ce5685
Error response from daemon: Get "https://harbor.example.com/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority

添加ca证书的信任

# 将之前生成的ca.crt证书拷贝到当前机器
sudo cp ca.crt /etc/pki/ca-trust/source/anchors/

sudo update-ca-trust

sudo systemctl restart docker

# 再尝试拉取镜像
docker pull harbor.example.com/library/nginx@sha256:01ccf4035840dd6c25042b2b5f6b09dd265b4ed5aa7b93ccc4714027c0ce5685
harbor.example.com/library/nginx@sha256:01ccf4035840dd6c25042b2b5f6b09dd265b4ed5aa7b93ccc4714027c0ce5685: Pulling from library/nginx
f56be85fc22e: Pull complete
2ce963c369bc: Pull complete
59b9d2200e63: Pull complete
3e1e579c95fe: Pull complete
547a97583f72: Pull complete
1f21f983520d: Pull complete
c23b4f8cf279: Pull complete
Digest: sha256:01ccf4035840dd6c25042b2b5f6b09dd265b4ed5aa7b93ccc4714027c0ce5685
Status: Downloaded newer image for harbor.example.com/library/nginx@sha256:01ccf4035840dd6c25042b2b5f6b09dd265b4ed5aa7b93ccc4714027c0ce5685
harbor.example.com/library/nginx@sha256:01ccf4035840dd6c25042b2b5f6b09dd265b4ed5aa7b93ccc4714027c0ce5685
2.1 containerd所在的K8S几区节点添加证书信任

我之前的文章有介绍过如何为containerd设置非授信仓库如果感兴趣请查看:containerd 设置非授信仓库
使用如下命令尝试pull Harbor仓库中公开的镜像,可以看到由于仓库不授信无法拉取镜像。

crictl pull harbor.example.com/library/nginx@sha256:01ccf4035840dd6c25042b2b5f6b09dd265b4ed5aa7b93ccc4714027c0ce5685
E0828 20:41:53.947090   21601 remote_image.go:238] "PullImage from image service failed" err="rpc error: code = Unknown desc = failed to pull and unpack image \"harbor.example.com/library/nginx@sha256:01ccf4035840dd6c25042b2b5f6b09dd265b4ed5aa7b93ccc4714027c0ce5685\": failed to resolve reference \"harbor.example.com/library/nginx@sha256:01ccf4035840dd6c25042b2b5f6b09dd265b4ed5aa7b93ccc4714027c0ce5685\": failed to do request: Head \"https://harbor.example.com/v2/library/nginx/manifests/sha256:01ccf4035840dd6c25042b2b5f6b09dd265b4ed5aa7b93ccc4714027c0ce5685\": x509: certificate signed by unknown authority" image="harbor.example.com/library/nginx@sha256:01ccf4035840dd6c25042b2b5f6b09dd265b4ed5aa7b93ccc4714027c0ce5685"
FATA[0000] pulling image: rpc error: code = Unknown desc = failed to pull and unpack image "harbor.example.com/library/nginx@sha256:01ccf4035840dd6c25042b2b5f6b09dd265b4ed5aa7b93ccc4714027c0ce5685": failed to resolve reference "harbor.example.com/library/nginx@sha256:01ccf4035840dd6c25042b2b5f6b09dd265b4ed5aa7b93ccc4714027c0ce5685": failed to do request: Head "https://harbor.example.com/v2/library/nginx/manifests/sha256:01ccf4035840dd6c25042b2b5f6b09dd265b4ed5aa7b93ccc4714027c0ce5685": x509: certificate signed by unknown authority 
# 将之前生成的ca.crt证书拷贝到当前机器
sudo cp ca.crt /etc/pki/ca-trust/source/anchors/

sudo update-ca-trust

sudo systemctl restart containerd

# 再尝试拉取镜像
crictl pull harbor.example.com/library/nginx@sha256:01ccf4035840dd6c25042b2b5f6b09dd265b4ed5aa7b93ccc4714027c0ce5685
Image is up to date for sha256:8e75cbc5b25c8438fcfe2e7c12c98409d5f161cbb668d6c444e02796691ada70
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要为 Harbor 自动申请 SSL 证书,可以使用 cert-manager 工具。cert-manager 是一个 Kubernetes 上的证书管理工具,可以自动为您的应用程序生成和更新 SSL 证书。 以下是为 Harbor 自动申请 SSL 证书的步骤: 1. 安装 cert-manager 工具。可以使用以下命令安装: ``` kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.0.4/cert-manager.yaml ``` 2. 创建一个 Issuer。Issuer 是一个 Kubernetes 资源,用于定义证书颁发机构 (CA) 的详细信息。可以使用以下 YAML 文件创建 Issuer: ```yaml apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: letsencrypt namespace: cert-manager spec: acme: email: your-email@example.com server: https://acme-v02.api.letsencrypt.org/directory privateKeySecretRef: name: letsencrypt solvers: - http01: ingress: class: nginx ``` 在此 YAML 文件中,您需要将 `your-email@example.com` 替换为您的电子邮件地址。该文件使用 Let's Encrypt 作为证书颁发机构,因此您需要使用 Let's Encrypt 帐户来签署证书申请。此文件还配置了 HTTP-01 验证器,以便 cert-manager 可以验证您拥有该域名。 3. 创建一个 Certificate。Certificate 是一个 Kubernetes 资源,用于定义 SSL 证书的详细信息。可以使用以下 YAML 文件创建 Certificate: ```yaml apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: harbor-cert namespace: harbor spec: secretName: harbor-tls dnsNames: - your-domain.com issuerRef: name: letsencrypt kind: Issuer ``` 在此 YAML 文件中,您需要将 `your-domain.com` 替换为您要为其颁发证书的域名。此文件还指定了要使用的 Issuer。 4. 创建一个 Ingress。Ingress 是一个 Kubernetes 资源,用于将 HTTP(S) 流量路由到您的应用程序。可以使用以下 YAML 文件创建 Ingress: ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: harbor-ingress namespace: harbor annotations: kubernetes.io/ingress.class: nginx cert-manager.io/issuer: "letsencrypt" spec: tls: - secretName: harbor-tls hosts: - your-domain.com rules: - host: your-domain.com http: paths: - path: / pathType: Prefix backend: service: name: harbor port: name: http ``` 在此 YAML 文件中,您需要将 `your-domain.com` 替换为您的域名。此文件还使用了之前创建的 Issuer 和 Certificate。 5. 部署 Harbor。可以使用 Helm 安装 Harbor,如以下命令所示: ``` helm install harbor harbor/harbor --version=1.5.2 -f harbor-values.yaml ``` 在此命令中,`harbor-values.yaml` 是一个 YAML 文件,用于配置 Harbor 的各种选项。 这样,您就可以使用 cert-manager 工具自动申请和更新 HarborSSL 证书了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值