Harbor 使用自签名证书配置 https 认证
我们知道 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.key
、 ca.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.key
、 10.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.crt、10.34.56.78.key、ca.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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论