侧边栏壁纸
博主头像
Blog博主等级

行动起来,活在当下

  • 累计撰写 211 篇文章
  • 累计创建 94 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

自建仓库registry使用证书认证方法

1.证书创建过程

服务端创建所需目录

mkdir -p /home/docker-registry/certs /home/docker-registry/registry

1.1 创建配置文件(san.cnf)

创建一个文本文件,命名为 san.cnf,用于定义证书生成的配置。示例内容如下:

[req]
distinguished_name = req_distinguished_name
req_extensions = req_ext

[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = California
localityName = Locality Name (eg, city)
localityName_default = San Francisco
organizationName = Organization Name (eg, company)
organizationName_default = Example, Inc.
commonName = test (e.g. server FQDN or YOUR name)
commonName_max = 64
commonName_default = siyu.com

[req_ext]
subjectAltName = @alt_names

[alt_names]
DNS.1 = siyu.com

在 [alt_names] 部分,添加你需要的所有主机名或域名,以 DNS. 开头,依次编号。

1.2 生成私钥文件

openssl genrsa -out /home/docker-registry/certs/domain.key 2048

1.3 生成证书请求(CSR)

使用 OpenSSL 工具根据上面的配置文件生成证书请求。

openssl req -new -out /home/docker-registry/certs/domain.csr -key /home/docker-registry/certs/domain.key -config san.cnf
  • new:生成新的证书请求。

  • out: yourdomain.csr:指定输出的证书请求文件。

  • key yourdomain.key:指定与请求关联的私钥文件。

  • config san.cnf:指定使用上面定义的配置文件。

1.4 生成自签名证书

openssl x509 -req -in /home/docker-registry/certs/domain.csr -out /home/docker-registry/certs/domain.crt -days 365 -signkey /home/docker-registry/certs/domain.key -extensions req_ext -extfile san.cnf
  • req:指定输入的文件是一个证书请求。

  • in yourdomain.csr:指定输入的证书请求文件。

  • out yourdomain.crt:指定输出的证书文件。

  • days 365:指定证书有效期限,这里设置为 365 天。

  • signkey yourdomain.key:指定用于签名证书的私钥文件。

  • extensions req_ext 和 -extfile san.cnf:指定使用之前定义的扩展配置。

1.5 验证证书中的 SANs

可以使用以下命令验证生成的证书是否正确包含了 SANs:

openssl x509 -noout -text -in /home/docker-registry/certs/domain.crt

在输出中,应该可以看到包含了 [Subject Alternative Name] 部分,列出了所有的 DNS 名称。

重启docker服务

systemctl restart docker

2.自建仓库搭建过程

2.1 docker 客户端配置

cp /home/docker-registry/certs/domain.crt /etc/docker/certs.d/siyu.com/ca.crt 

注意siyu.com 文件夹和证书中申请的域名保持一致。

2.2 启动register仓库容器

docker run -d --restart=always  --name registry2 -v /home/docker-registry/certs:/certs -v /home/docker-registry/registry:/var/lib/registry -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key -p 443:443  registry:2

2.3 认证过程

客户端使用ca.crt 证书和服务端的domain.key私钥做认证,认证通过后建立tls连接。

注意:每个客户端都需要:

echo "192.168.1.192 siyu.com" >> /etc/hosts

2.4 k3s 中container配置

注意:不要随意更改/etc/rancher/k3s/k3s.yaml

2.4.1 创建registries.yaml 文件用于配置仓库信息。

vi /etc/rancher/k3s/registries.yaml

mirrors:
  siyu.com:
    endpoint:
      - "https://siyu.com"
configs:
  siyu.com:
    tls:
      ca_file: /etc/pki/tls/certs/ca.crt

注意证书路径是/etc/pki/tls/certs/ca.crt

2.4.2 重启master节点上k3s进程

systemctl restart k3s

k3s 所有节点证书路径都是/etc/pki/tls/certs/ca.crt,都需要证书。

3.自动化脚本

3.1 自动拉取、打标签、推送到仓库脚本

vi autopush_repo.sh

#!/bin/bash

# 检查参数数量
if [ "$#" -ne 2 ]; then
    echo "用法: $0 <镜像名称> <镜像版本>"
    exit 1
fi

# 获取参数
IMAGE_NAME=$1
IMAGE_VERSION=$2

# 定义仓库地址
REPO_URL="siyu.com"

# 拉取镜像
docker pull ${IMAGE_NAME}:${IMAGE_VERSION}
if [ $? -ne 0 ]; then
    echo "拉取镜像失败: ${IMAGE_NAME}:${IMAGE_VERSION}"
    exit 2
fi

# 给镜像打标签
NEW_TAG="${REPO_URL}/${IMAGE_NAME}:${IMAGE_VERSION}"
docker tag ${IMAGE_NAME}:${IMAGE_VERSION} ${NEW_TAG}
if [ $? -ne 0 ]; then
    echo "打标签失败: ${NEW_TAG}"
    exit 3
fi

# 推送镜像到仓库
docker push ${NEW_TAG}
if [ $? -ne 0 ]; then
    echo "推送镜像失败: ${NEW_TAG}"
    exit 4
fi

echo "成功完成操作: ${NEW_TAG}"

3.2 获取仓库所有镜像名称及版本

vi list_repo-https.sh

#!/bin/bash

REGISTRY_URL="https://siyu.com"

# 获取所有仓库
REPOS=$(curl -ks ${REGISTRY_URL}/v2/_catalog | jq -r '.repositories[]')

for repo in $REPOS; do
    echo "Repository: $repo"
    # 获取仓库中的所有标签
    TAGS=$(curl -ks ${REGISTRY_URL}/v2/${repo}/tags/list | jq -r '.tags[]')
    for tag in $TAGS; do
        echo "  Tag: $tag"
    done
done

0

评论区