为Harbor设置Https

为 Docker Harbor 设置HTTPS, 需要经历如下步骤:

  • 设置域名
  • 开启https
  • 生成证书
  • 配置Harbor的证书
  • docker daemon信任证书

设置Harbor的域名

打开 harbor.cfg 配置 hostname

1
hostname = test.registry.azure

打开https

打开 harbor.cfg 配置 ui_url_protocol

1
ui_url_protocol = https

生成证书

创建自签的CA

1
openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt

生成签名

1
openssl req -newkey rsa:4096 -nodes -sha256 -keyout registry.azure.key -out registry.azure.csr


ps: 如果使用域名访问registry,这里是test.registry.azure, 那么签名的CN(Common Name) 必须是test.registry.azure。如果使用IP地址,那么CN可以任意选择。如果不对,就会出现如下类似错误。

1
Error response from daemon: Get https://azure-test.registry.com/v1/users/: x509: certificate is valid for XXX, not azure-test.registry.com

生成证书

1
openssl x509 -req -days 365 -in registry.azure.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out registry.azure.crt

如果使用的是IP地址,可以执行如下命令:

1
2
3
4
echo subjectAltName = IP:192.168.1.101 > extfile.cnf
openssl x509 -req -days 365 -in registry.azure.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out registry.azure
.crt

配置Harbor证书

打开harbor.cfg

1
2
ssl_cert = /home/psd/ca/registry.azure.crt
ssl_cert_key = /home/psd/ca/registry.azure.key

Docker daemon信任证书

保证Docker daemon没有开启 -insecure-registry

1
2
mkdir /etc/docker/certs.d/test.registry.azure
cp /home/psd/ca/ca.crt /etc/docker/certs.d/test.registry.azure

重启docker。

1
2
3
4
docker login test.registry.azure
Username: admin
Password:
Login Success

完成。

问题: harbor部署在内网,如果外网想要访问就需要通过堡垒机的nginx代理转发,nginx没有配置https导致不能登录harbor。


如图所示,login返回状态码200,带有cookie,但是获取当前用户时,并没有把该cookie带上。
login登录返回的cookie中,带有secure属性,强制要求使用https,否则就会失效。
配置nginx使用https后登录成功。