Harbor 使用自签名证书配置 https 认证

发布于 2024-08-30 10:37:02 字数 4251 浏览 10 评论 0

我们知道 Harbor 是用来存储 docker 镜像的仓库系统。目前 docker 从镜像仓库 pull 或 push 镜像都是采用 https 形式的(例如官方的 Docker hub),故有必要将 Harbor 配置成 https 访问,并使其他 Docker 机器能成功推送、拉取镜像。

步骤

关于 Harbor 配置 https 的文档 官方 有非常详尽的说明。这里主要对一些我遇到的问题做一个补充。因我这里配置 Harbor 的机器没有申请到域名,故只能采用 Harbor 主机 IP 代替,假设 IP 为:10.34.56.78。

1. 生成证书

10.34.56.78 的机器目录下新建文件夹例如叫 ca_files (绝对路径假设为 /home/usr/ca_files ),然后在该目录下依照官方文档步骤生成证书(下面每个命令以 ### 隔开):

mkdir ca_files
###
cd ca_files
###
openssl genrsa -out ca.key 4096
###
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=10.34.56.78" -key ca.key -out ca.crt

上面的命令运行完后,可以看到在 ca_files 下生成了 ca.keyca.crt 两个文件,继续运行如下命令来生成私钥:

openssl genrsa -out 10.34.56.78.key 4096
###
openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=10.34.56.78" -key 10.34.56.78.key -out 10.34.56.78.csr

上面命令运行完后可以看到在 ca_files 下继续生成了 10.34.56.78.key10.34.56.78.csr 两个文件。

接着生成一个 v3.ext 文件并使用这个文件来获取认证,命令如下:

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:10.34.56.78
EOF
### 
openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in 10.34.56.78.csr -out 10.34.56.78.crt

不出意外又会在 ca_files 文件夹下生成一些文件.这里要注意,上面第一个命令中的:subjectAltName = IP:10.34.56.78 这一行与官方文档中有些不同,因为我们这里没有申请域名,所以直接以 IP 指定。

2. 配置 Harbor

假设我这里在 10.34.56.78 机器上安装 Harbor 的绝对路径为/home/usr/harbor,则在 harbor 目录下找到 harbor.yml 文件(我这里 Harbor 安装的版本为 v1.10.1)进行编辑:

# https related config
https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  # 注意这里配置证书路径
  certificate: /home/usr/ca_files/10.34.56.78.crt
  private_key: /home/usr/ca_files/10.34.56.78.key

配置完成后,若 Harbor 还没有安装,则直接在 harbor 目录下运行:

sudo ./install.sh

若 Harbor 已安装过,则在 harbor 目录下运行如下命令:

sudo ./prepare
###
docker-compose down -v
###
docker-compose up -d

此时,若没有报错,则 Harbor 已经变成 https 访问了。

3. 在其他机器上 docker login Harbor

假设我有另一台机器(IP 为:12.34.56.78),这台机器已配置完 docker 环境,并且我已经做好了一个 docker 的 image,假设 image 名为:my_nginx:v1.0。
这时,为了使该机器能 docker login 10.34.56.78 成功,我们还需要做一些配置。首先在 12.34.56.78 机器上创建一个文件夹(例如名为:my_ca,绝对路径是:/home/me/my_ca),然后将 10.34.56.78 机器(即 Harbor 部署的主机)的 ca_files 文件夹下的:10.34.56.78.crt10.34.56.78.keyca.crt这三个文件拷贝到 my_ca 目录下。
拷贝完成后,进入到 my_ca 目录下,运行如下命令:

openssl x509 -inform PEM -in 10.34.56.78.crt -out 10.34.56.78.cert

可以看到 my_ca 目录下新生成了 10.34.56.78.cert 这个文件。
下面我们需要在 12.34.56.78 这台机器的/etc/docker/目录下创建一对父子文件夹(certs.d/10.34.56.78),命令如下:

mkdir –p /etc/docker/certs.d/10.34.56.78

创建完后成,我们将 my_ca 目录下的一些文件拷贝到 certs.d/10.34.56.78 目录下,即:

cd /home/me/my_ca/
###
cp 10.34.56.78.cert /etc/docker/certs.d/10.34.56.78/
###
cp 10.34.56.78.key /etc/docker/certs.d/10.34.56.78/
###
cp ca.crt /etc/docker/certs.d/10.34.56.78/

接着重启 docker 服务:

systemctl restart docker

上面的操作进行完后,我们就能在 12.34.56.78 这台机器上 docker login 10.34.56.78 并推送 my_nginx:v1.0 这个 image 了。
例如在 Harbor 系统网站内建立一个名为 test 的项目,则推送 image 到该项目下的命令为:

docker tag my_nginx:v1.0 10.34.56.78/test/my_nginx:v1.0
docker push 10.34.56.78/test/my_nginx:v1.0

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
21 人气
更多

推荐作者

我们的影子

文章 0 评论 0

素年丶

文章 0 评论 0

南笙

文章 0 评论 0

18215568913

文章 0 评论 0

qq_xk7Ean

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文