一、文档概述
1.1 文档目的
本文档为企业生产级标准部署手册,针对私有化部署的Harbor镜像仓库,从零完成SSL/TLS证书生成、HTTPS协议配置、服务重启、客户端适配、异常排查全流程落地。彻底解决Harbor默认HTTP明文传输的安全风险,满足企业容器镜像仓库安全合规、内网安全访问、K8s集群镜像拉取、CI/CD流水线对接等生产刚需场景。
文档所有步骤经过生产环境验证,适配主流Linux系统、Docker/Docker Compose、Kubernetes集群,可直接用于企业标准化落地、新人运维培训、生产环境变更上线。
1.2 适用范围
-
适用环境:私有化部署Harbor(2.0+全版本,离线/在线安装包)、CentOS 7/8、Ubuntu 18.04/20.04
-
适用场景:企业内网私有镜像仓库安全加固、K8s集群镜像仓库对接、Jenkins等CI/CD工具HTTPS访问、禁止HTTP明文传输的合规环境
-
适用人员:运维工程师、容器工程师、DevOps工程师、运维实习生
1.3 前置依赖
-
服务器已安装Docker、Docker Compose(Harbor运行必备)
-
已部署正常运行的私有Harbor仓库(HTTP可正常访问)
-
服务器可联网(可选,仅系统依赖更新使用)
-
拥有服务器root超级管理员权限
-
服务器已配置固定内网域名/IP(推荐域名访问,证书适配性更佳)
1.4 技术规范
-
加密协议:TLS 1.2/1.3(禁用老旧SSLv3、TLS1.0/1.1)
-
密钥算法:RSA 4096(企业生产安全标准)
-
证书有效期:10年(内网自建CA证书,规避短期过期频繁更替问题)
-
证书类型:自建CA根证书+服务器域名证书(适配所有内网客户端,无浏览器不信任告警)
二、环境信息规划
为统一部署标准,本文档固定环境参数,用户可根据自身实际环境替换
| 参数名称 | 说明 | 备注说明 |
|---|---|---|
| Harbor服务器IP | 192.48.75.165 | 私有内网服务器IP |
| Harbor访问域名 | harbor.company.local | 内网DNS/hosts解析域名,生产必须使用域名 |
| Harbor安装目录 | /opt/harbor | 默认离线包安装路径,自定义路径需对应修改 |
| 证书存储目录 | /opt/harbor/cert | 专属证书目录,统一管理,权限严格管控 |
| 系统版本 | Rocky Linux 10 | 主流企业服务器系统 |
| Harbor版本 | 2.10+ | 全2.x版本配置逻辑通用 |
三、环境预处理与依赖检查
3.1 安装OpenSSL工具
OpenSSL为证书生成核心工具,系统默认预装,若无则手动安装
Rocky系统:
bash
dnf install -y openssl openssl-devel
Ubuntu系统:
bash
apt update && apt install -y openssl
检查版本(确认可用):
bash
openssl version
3.2 域名解析校验
所有客户端(Docker、K8s、浏览器)必须通过域名访问Harbor,先配置解析
1、服务端配置hosts解析
bash
echo "192.48.75.165 harbor.company.local" >> /etc/hosts
2、测试解析连通性
bash
ping harbor.company.local -c 2
生产建议:内网DNS服务器统一添加域名解析,无需每台机器配置hosts
四、企业级SSL/TLS证书生成(自建CA全流程)
生产内网环境推荐自建CA证书(免费、可控、永久有效、适配内网所有设备),公网环境可替换为阿里云/腾讯云可信CA证书。本节全程手动生成根证书、服务器证书,支持域名+IP双重适配。
4.1 创建证书专属目录
bash
# 创建证书目录并授权
mkdir -p /opt/harbor/cert
chmod 700 /opt/harbor/cert
cd /opt/harbor/cert
4.2 生成CA根证书(自签名根证书)
根证书为内网信任基石,所有客户端需导入该根证书实现免信任告警访问
1、生成CA私钥(4096位加密)
bash
# 生成CA私钥
[root@node cert]# openssl genrsa -out ca.key 4096
# 文件名
[root@node cert]# ll
total 4
-rw-------. 1 root root 3272 Aug 10 17:30 ca.key
2、生成CA根证书(有效期10年)
bash
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt -subj "/C=CN/ST=Beijing/L=Beijing/O=Company/OU=DevOps/CN=harbor-ca.company.local"
# 文件名
[root@node cert]# ll
total 8
-rw-r--r--. 1 root root 2074 Aug 10 17:32 ca.crt
参数说明:C=国家、ST=省份、L=城市、O=企业名称、OU=部门、CN=根证书域名,可自定义修改
4.3 生成Harbor服务器证书
核心步骤:配置SAN扩展(解决证书域名不匹配、IP访问报错问题,企业必备)
1、创建SAN扩展配置文件,支持域名+IP双重验证
2、生成Harbor服务器私钥
bash
# 创建SAN扩展配置文件,支持域名+IP双重验证
[root@node cert]# cat > server.ext << EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = DNS:harbor.company.local,IP:192.48.75.165
EOF
bash
# 生成Harbor服务器私钥
[root@node cert]# openssl genrsa -out server.key 4096
# 文件名
[root@node cert]# ll
total 16
-rw-------. 1 root root 3272 Aug 10 17:35 server.key
3、生成证书请求文件(CSR)
bash
# 生成证书请求文件(CSR)
[root@node cert]# openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Company/OU=DevOps/CN=harbor.company.local"
# 文件名
[root@node cert]# ll
total 20
-rw-r--r--. 1 root root 1712 Aug 10 17:36 server.csr
4、CA签发服务器证书(有效期10年)
bash
[root@node cert]# openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650 -sha256 -extfile server.ext
# 执行结果
Certificate request self-signature ok
subject=C=CN, ST=Beijing, L=Beijing, O=Company, OU=DevOps, CN=harbor.company.local
------------------------------------------------------------------------------------
[root@node cert]# ll
total 28
-rw-r--r--. 1 root root 2163 Aug 10 17:37 server.crt
4.4 证书文件校验
执行完成后,cert目录下生成5个核心文件,确认文件存在无缺失
bash
ll /opt/harbor/cert

核心文件说明:
-
ca.crt:CA根证书(客户端信任必备)
-
ca.key:CA根私钥(涉密,严格保密)
-
server.crt:Harbor服务端证书
-
server.key:Harbor服务端私钥(涉密)
-
server.csr:证书请求文件(备用留存)
五、Harbor核心配置HTTPS(生产核心步骤)
5.1 修改Harbor配置文件
进入Harbor安装目录,编辑核心配置文件harbor.yml
bash
cd /opt/harbor
vim harbor.yml
1、注释原有HTTP配置(必须注释,防止端口冲突、协议冲突)
bash
# http:
# port: 80
2、开启HTTPS配置,填写证书路径与443端口
bash
https:
# https port
port: 443
# 服务端证书文件路径
certificate: /opt/harbor/cert/server.crt
# 服务端私钥文件路径
private_key: /opt/harbor/cert/server.key
3、修改hostname为配置的内网域名(必须与证书CN一致)
bash
hostname: harbor.company.local
5.2 初始化配置并重启Harbor服务
Harbor通过prepare脚本加载证书配置,重新生成Nginx代理配置
1、停止现有Harbor服务
bash
docker compose down
2、重新初始化配置(加载HTTPS证书)
bash
./prepare
3、后台启动Harbor服务
bash
docker compose up -d
4、检查容器运行状态(确保所有容器正常启动)
bash
docker compose ps
六、服务端HTTPS有效性验证
6.1 命令行访问验证
bash
# 验证HTTPS访问,返回200正常
curl -I https://harbor.company.local
验证会报错

如何解决呢
故障根因 :Rocky Linux 10 系统未导入自建CA根证书、系统信任库未刷新,curl/系统层级无法识别内网自建证书签发机构,属于自建HTTPS证书最常见报错。并非证书配置错误,是系统全局证书信任缺失。
适配Rocky10 一键修复步骤(生产可用)
1、将Harbor CA根证书移入系统全局信任目录
bash
cp /opt/harbor/cert/ca.crt /etc/pki/ca-trust/source/anchors/
2、刷新系统证书信任库(Rocky10 专属命令)
bash
update-ca-trust extract
3、重启Docker,刷新容器层证书信任
bash
systemctl restart docker
4、验证修复结果
bash
curl -I https://harbor.company.local

输出以上结果, 就代表成功了
6.2 浏览器访问验证
浏览器输入https://harbor.company.local,
默认输入域名是不能解析的, 需要在Windows 里面配置
Shell
# Windows 路径 注意: 需要管理员的方式才可以修改
C:\Windows\System32\drivers\etc\hosts
# 在文件中添加如下内容
192.48.75.165 harbor.company.local

修改之后, 就可以用域名访问了

点击高级

然后就会进入harbor界面

虽然显示不安全, 但是,真实Linux 系统中是绝对安全的
能不能显示安全呢
导入根证书后无不安全告警、可正常登录后台即为配置成功。
根证书导入方法:浏览器设置-隐私安全-证书管理-导入ca.crt,选择信任该根证书。




无痕模式下,再次打开

6.3、镜像测试
-
在Harbor 中创建一个项目

此时一个镜像都没有

-
先到官方拉取镜像
Shell# 先拉取镜像 [root@node ~]# docker pull nginx:1.19 # 查看镜像 [root@node ~]# docker images | grep nginx: nginx:1.19 df13abe416e3 197MB 53.7MB -
给镜像打标签
Shell# 打标签 [root@node ~]# docker tag nginx:1.19 harbor.company.local/test/nginx:v1 # 检查 [root@node ~]# docker images | grep nginx:v1 harbor.company.local/test/nginx:v1 df13abe416e3 197MB 53.7MB -
Docker 登录Harbor
Shell[root@node ~]# docker login harbor.company.local
-
push 镜像
Shell[root@node ~]# docker push harbor.company.local/test/nginx:v1 -
浏览器查看

-
再来一个 pull 镜像
-
测试之前, 先删除本地镜像
Shell[root@node ~]# docker rmi harbor.company.local/test/nginx:v1检查是否还存在

-
从本地 Harbor pull 镜像



-
终端执行
Shell[root@node ~]# docker pull harbor.company.local/test/nginx@sha256:eba373a0620f68ffdc3f217041ad25ef084475b8feb35b992574cd83698e9e3c
这里有一个小坑, 直接复制就是, 镜像的id , 会很长, 所以建议 pull, 写上版本
Shell[root@node ~]# docker pull harbor.company.local/test/nginx:v1
这样明显更好区分
-
七、客户端全场景适配(企业核心落地步骤)
Harbor配置HTTPS后,所有Docker客户端、K8s节点必须配置证书信任,否则镜像拉取、推送报错。
7.1 Linux Docker客户端适配
所有需要访问Harbor的Linux服务器执行以下操作
1、创建Docker证书信任目录
bash
mkdir -p /etc/docker/certs.d/harbor.company.local
2、拷贝服务端CA根证书至客户端信任目录
3、重启Docker服务生效
bash
systemctl restart docker
bash
scp root@192.48.75.165:/opt/harbor/cert/ca.crt /etc/docker/certs.d/harbor.company.local/
4、测试登录与镜像推送
bash
[root@docker ~]# docker login harbor.company.local
Username: 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
---------------------------------------------------------------------------------
# 测试推送镜像
[root@docker ~]# docker tag redis:7.2 harbor.company.local/redis/redis:v7.2
[root@docker ~]# docker push harbor.company.local/redis/redis:v7.2
7.2 Kubernetes集群节点适配
所有K8s Master、Node节点均需配置证书信任,步骤同上,同时将根证书加入系统信任列表
bash
# CentOS系统
cp ca.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust
# Ubuntu系统
cp ca.crt /usr/local/share/ca-certificates/
update-ca-certificates
# 重启Docker
systemctl restart docker
八、生产环境故障排查手册
8.1 报错:x509: certificate signed by unknown authority
故障原因:客户端未导入CA根证书,未信任自建证书
解决方案:严格按照第七章客户端适配步骤,导入ca.crt并重启Docker
8.2 报错:certificate does not match hostname / IP
故障原因:SAN扩展未配置或配置错误,域名/IP与访问地址不匹配
解决方案:重新修改server.ext文件,添加对应访问域名/IP,重新签发证书并重启Harbor
8.3 浏览器访问提示不安全
故障原因:浏览器未导入根证书、证书过期、hostname配置不匹配
解决方案:导入ca.crt根证书,核对harbor.yml的hostname与证书CN一致
8.4 Harbor容器启动失败
故障原因:证书文件路径错误、文件权限过高/过低、私钥与证书不匹配
解决方案:核对harbor.yml证书路径,证书目录权限700,文件权限600,重新生成证书
8.5 核心报错:curl: (60) SSL certificate problem: unable to get local issuer certificate
故障根因 :Rocky Linux 10 系统未导入自建CA根证书、系统信任库未刷新,curl/系统层级无法识别内网自建证书签发机构,属于自建HTTPS证书最常见报错。并非证书配置错误,是系统全局证书信任缺失。
适配Rocky10 一键修复步骤(生产可用)
1、将Harbor CA根证书移入系统全局信任目录
bash
cp /opt/harbor/cert/ca.crt /etc/pki/ca-trust/source/anchors/
2、刷新系统证书信任库(Rocky10 专属命令)
bash
update-ca-trust extract
3、重启Docker,刷新容器层证书信任
bash
systemctl restart docker
4、验证修复结果
bash
curl -I https://harbor.company.local
补充兜底方案(仍报错时执行)
单独给curl配置信任证书,临时兜底验证服务可用性:
bash
curl --cacert /opt/harbor/cert/ca.crt -I https://harbor.company.local
关键注意事项 :该报错仅影响系统本机curl、Docker、服务调用,不代表Harbor Nginx证书配置错误;所有访问该Harbor的Rocky10客户端节点,均需执行上述系统证书信任步骤。
九、企业级运维规范与安全加固
9.1 证书安全规范
-
CA私钥、服务端私钥禁止外传、禁止权限开放,目录权限严格设置700
-
证书文件定期备份,留存证书生成配置文件,便于过期更替
-
禁止使用过期证书、弱加密算法(RSA2048及以下)
9.2 服务运维规范
-
证书更新操作需走企业变更流程,停机窗口操作,更新后全客户端验证
-
定期巡检HTTPS状态、证书有效期,提前30天更新证书
-
生产环境永久关闭HTTP明文访问,杜绝安全漏洞
9.3 日志监控规范
监控Harbor Nginx证书访问日志,及时发现证书异常、非法访问请求,日志路径:/opt/harbor/logs/