Docker系列(七):Harbor(二)

简介

Harbor并没有搭载任何的证书,所以默认只提供HTTP的服务。但,在生产环境中强烈建议使用HTTPS。 Harbor有一个Nginx实例给所有的服务做反向代理,你可以使用prepare脚本去配置Nginx开启https。

获取一张证书

假设你的仓库的配置的hostnamereg.yourdomain.com, 并且它的DNS记录指向了运行Harbor的主机。 首先,需要有一张从CA签发的证书, 这张证书通常包含a.crt文件和a.key文件,例如: yourdomain.com.crtyourdomain.com.key

在一个测试或者开发环境中,你可能选择使用自签发的证书来替代从一个CA签发的证书。 下面的命令可以生成一张你自己的证书:

  1. 创建自己的CA证书:
1
2
3
$ openssl req \
-newkey rsa:4096 -nodes -sha256 -keyout ca.key \
-x509 -days 365 -out ca.crt
  1. 生成一个证书签名请求:

如果你使用像reg.yourdomain.com这样的FQDN去访问你仓库,你就必须使用reg.yourdomain.com作为CN(Common Name)。 否则, 如果你使用IP去连接仓库的主机, CN可以任意填写,例如:你的名字等等:

$ openssl req \
    -newkey rsa:4096 -nodes -sha256 -keyout yourdomain.com.key \
    -out yourdomain.com.csr
  1. 生成你仓库的主机的证书:

如果你使用像reg.yourdomain.com这样的FQDN去访问你的仓库,运行下面的命令去生成你仓库的主机的证书:

$ openssl x509 -req -days 365 \
    -in yourdomain.com.csr -CA ca.csr -CAKey ca.key -CAcreateserial \
    -out yourdomain.com.crt

如果是使用IP地址(如:192.168.1.101)去访问你的仓库, 你需要使用下面的命令:

$ echo "subjectAltName = IP:192.168.1.101" > extfile.cnf
$ openssl x509 -req -days 365 \
    -in yourdomain.com.csr -CA ca.crt -CAKey ca.key -CAcreateserial -extfile extfile.cn \
    -out yourdomain.com.crt

配置并安装

得到yourdomain.com.crtyourdoman.com.key文件后,你可以把他们放入指定的文件夹,如: /root/cert/:

$ cp yourdomain.com.csr /root/cert/
$ cp yourdomain.com.key /root/cert/

接下来,编辑make/harbor.cfg文件, 更新hostnameprotocol, 并更新属性ssl_certssl_cert_key:

#set hostname
hostname = reg.yourdomain.com
#set ui_url_protocol
ui_url_protocol = https
......
#The path of cert and key files for nginx, they are applied only the protocol is set to https 
ssl_cert = /root/cert/yourdomain.com.crt
ssl_cert_key = /root/cert/yourdomain.com.key

生成Harbor的配置文件:

$ ./prepare

如果Harbor已经正在运行,先停止并移除所有存在的实例。 你的image数据会保留在文件系统中。

$ docker-compose down -v

最后,重启Harbor:

$ docker-compose up -d

在配置好Harbor HTTPS后,可以通过以下几步进行验证:

  1. 打开浏览器,并输入https://reg.yourdomain.com。 应该会显示Harbor的界面。
  2. 在安装了Docker的主机上,并确认没有配置”-insecure-registry”。 将以上步骤生成的ca.crt拷贝到这个Docker主机的/etc/docker/certs.d/reg.yourdomain.com(或者是你仓库主机的IP)目录, 如果这个目录不存在,需要手动创建一下。如果仓库的nginx监听端口(443)改为其它端口,需要更改这个目录的名字为/etc/docker/certs.d/reg.yourdomain.com:port(或者仓库主机IP:port)。然后运行docker命令去进行验证:
1
$ docker login reg.yourdomain.com

如果你已经更改nginx的监听端口,需要在登录时将端口添加上,如下:

$ docker login reg.yourdomain.com:port