Harbor 安全访问
Harbor 支持 Http 及 Https 协议访问, Harbor 安全访问需要基于 Https 协议, 本文介绍怎样配置 Harbor 的 Https 协议访问;
默认情况下,Harbor 不附带证书;可以在没有安全性的情况下部署 Harbor,以便可以通过 HTTP 连接到它。 但是只有在没有外部网络连接的空白测试或开发环境中,才可以使用 HTTP;在生产环境中使用 HTTP 会使您遭受中间人攻击,请务必使用 HTTPS。 要配置 HTTPS,必须创建 SSL 证书。您可以使用由受信任的第三方 CA 签名的证书,也可以使用自签名证书;
1. Harbor 启用 https 访问
本文中默认 172.31.12.216 映射为域名 harbor.repo, 生成证书既可以域名亦可以 ip
1.1 创建证书目录
mkdir -p /data/harbor/ssl
1.2 生成证书颁发机构证书
在生产环境中,您应该从 CA 获得证书。在测试或开发环境中,您可以生成自己的 CA。要生成 CA 证书,请运行以下命令
1.2.1 生成证书颁发机构私钥
openssl genrsa -out ca.key 4096
1.2.2 生成证书颁发机构证书
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Yunnan/L=Kunming/O=example/OU=Personal/CN=harbor.repo" \
-key ca.key -out ca.crt
如果是 ip 访问:
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Yunnan/L=Kunming/O=example/OU=Personal/CN=172.31.12.216" \
-key ca.key -out ca.crt
1.3 生成服务器证书
证书通常包含一个.crt 文件和一个.key 文件
1.3.1 生成服务器私钥
openssl genrsa -out harbor.repo.key 4096
如果是 ip 访问:
openssl genrsa -out 172.31.12.216.key 4096
1.3.2 生成证书签名请求
openssl req -sha512 -new \
-subj "/C=CN/ST=Yunnan/L=Kunming/O=example/OU=Personal/CN=harbor.repo" \
-key harbor.repo.key \
-out harbor.repo.csr
如果是 ip 访问:
openssl req -sha512 -new \
-subj "/C=CN/ST=Yunnan/L=Kunming/O=example/OU=Personal/CN=172.31.12.216" \
-key 172.31.12.216.key \
-out 172.31.12.216.csr
1.3.3 生成 x509 v3 扩展文件
无论您使用 FQDN 还是 IP 地址连接到 Harbor 主机,都必须创建此文件,以便可以为您的 Harbor 主机生成符合主题备用名称(SAN)和 x509 v3 的证书扩展要求。替换 DNS 条目以反映您的域
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.repo
DNS.2=*.harbor.repo
DNS.3=hostname
EOF
如果是 ip 访问
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:172.31.12.216
EOF
1.3.4 使用该 v3.ext 文件为 Harbor 服务器生成证书
openssl x509 -req -sha512 -days 3650 -extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in harbor.repo.csr \
-out harbor.repo.crt
如果是 ip 访问:
openssl x509 -req -sha512 -days 3650 -extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in 172.31.12.216.csr \
-out 172.31.12.216.crt
1.4 crt 转换
Docker 守护进程将 .crt 文件解释为 CA 证书,.cert 将文件解释为客户端证书,需将 harbor.repo.crt 转换为 harbor.repo.cert 以供 Docker 使用
openssl x509 -inform PEM -in harbor.repo.crt -out harbor.repo.cert
如果是 ip 访问:
openssl x509 -inform PEM -in 172.31.12.216.crt -out 172.31.12.216.cert
1.5 配置 Harbor 支持 https
修改 harbor.yml:
# https related config
https:
# https port for harbor, default is 443
port: 8443
# The path of cert and key files for nginx
certificate: /data/harbor/ssl/harbor.repo.crt
private_key: /data/harbor/ssl/harbor.repo.key
# enable strong ssl ciphers (default: false)
# strong_ssl_ciphers: false
1.6 配置 Docker 支持 Harbor 证书
harbor 有使用 https 证书时, docker 登录报错如下:
➜ ~ docker login -u admin -p Harbor12345 harbor.repo:8443
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get "https://harbor.repo:8443/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority
➜ ~
出现这种情况有 2 种解决办法:
1.6.1 方法一
编辑 Docker 配置文件
sudo nano /etc/docker/daemon.json
添加不安全的 Harbor 注册表地址
{
"insecure-registries": [
"https://172.31.12.216:8443",
"https://harbor.repo:8443"
]
}
重启 Docker 服务
sudo systemctl restart docker
登录 Harbor
➜ ~ docker login -u admin -p Harbor12345 harbor.repo:8443
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded
1.6.2 方法二
在 Docker 客户端机器上创建证书目录
mkdir -p /etc/docker/certs.d/harbor.repo:8443
如果 Docker 客户端是 MacOS:
mkdir -p ~/.docker/certs.d/harbor.repo:8443
复制自签名证书到 Docker 目录
sudo cp /data/harbor/ssl/ca.crt /etc/docker/certs.d/harbor.repo:8443/
sudo cp /data/harbor/ssl/harbor.repo.{cert,key} /etc/docker/certs.d/harbor.repo:8443/
重启 Docker 服务
sudo systemctl restart docker
登录 Harbor
➜ ~ docker login -u admin -p Harbor12345 harbor.repo:8443
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded