Harbor不附带任何的证书,默认使用http来对registry的请求做服务。所以,Harbor配置起来十分简单,但是呢,在生产环境中,还是推荐使用安全的方式。Harbor使用了一个Nginx做逆向代理,可以对其配置以启用https。
获取证书 ##
假定运行有Harbor的服务器对应的域名为reg.yourdomain.com. 首先应该从CA获取证书,即一个.crt文件,一个.key文件。
在测试和开放环境中可以使用自签名的证书取代从CA那里获取证书。下面命令产生自己的证书:
centos下,要更改
/etc/pki/tls/openssl.cnf
的CA_default部分,如下:[ CA_default ] dir = ./demoCA
创建自己的CA证书:
openssl req \ -newkey rsa:4096 -nodes -sha256 -keyout ca.key \ -x509 -days 365 -out ca.crt
生成证书签名请求:
如果使用域名,比如说reg.yourdomain.com来连接registry主机,必须将reg.yourdomain.com作为CN(Common Name)。如果使用IP地址连接registry主机,CN可以是任何名字,比如你的姓名或者其它。openssl req \ -newkey rsa:4096 -nodes -sha256 -keyout yourdomain.com.key \ -out yourdomain.com.csr
生成注册主机的证书:
在Ubuntu上,openssl的配置文件放在/etc/ssl/openssl.cnf
文件里。详细信息请参考openssl官方文档。openssl的默认CA目录称为demoCA。接下来创建必要的目录和文件:mkdir demoCA cd demoCA touch index.txt echo '01' > serial cd ..
如果你使用域名
reg.youdomain.com
来连接registry主机,那么,运行这个命令来生成registry主机的证书:openssl ca -in yourdomain.com.csr -out yourdomain.com.crt -cert ca.crt -keyfile ca.key -outdir .
如果你使用IP地址来连接registry主机,那么,需要运行一下的命令了:
echo subjectAltName = IP:your registry host IP > extfile.cnf openssl ca -in yourdomain.com.csr -out yourdomain.com.crt -cert ca.crt -keyfile ca.key -extfile extfile.cnf -outdir .
配置harbor.cfg
将验证客户端证书的开关关掉
verify_remote_cert = off
将在上文中的yourdomain.crt
和 yourdomain.com.key
的文件绝对路径填写到ssl_cert
和 ssl_cert_key
部分,如下:
#The path of cert and key files for Nginx,they are applied only the protocol is set to https
ssl_cert = /root/harbor/ca/yourdomain.com.crt
ssl_cert_key = /root/harbor/ca/yourdomain.com.key
安装Harbor
编辑文件make/harbor.cfg
,更新主机名和协议:
#set hostname
hostname = reg.yourdomain.com
#set ui_url_protocol
ui_url_protocol = https
直接运行make/install.sh
,包括了停止Harbor实例:
cd make
./install.sh
客户端设置(https验证)
linux下,创建目录/etc/docker/certs.d/yourdomain.com:port(或者registry主机的IP地址)
,将registry申请的证书 ca.crt
放到这个目录下面。
windows下,直接双击导入就行。
设定了Harbor的HTTPS后,可以通过以下的步骤来验证:
打开浏览器,输入地址:
https://reg.yourdomain.com
. 应该能够呈现Harbor的用户界面了。使用Docker daemon的机器上,确定选项
-insecure-registry
不会出现,还有必须拷贝上述的ca.crt到/etc/docker/certs.d/yourdomain.com(或者是registry主机的IP地址)
目录下,如果该目录不存在,需要创建。如果Nginx的端口不是443,是别的端口,目录就应该更改成:/etc/docker/certs.d/yourdomain.com:port(或者registry主机的IP地址)
。接着运行任意docker命令来验证https的配置。比如,docker login reg.yourdomain.com
docker login reg.yourdomain.com:port
ssl简介
- 客户机发送自己的ssl版本,加密算法配置,
- server发送自己的ssl版本,加密算法配置,并且用私钥加密信息,同时候,发送自己的证书
- client通过server发过来的证书进行server的身份认证,如果认证通过,就可以得到server的公钥,再对数据进行解密。
- clinent使用到目前为止所产生的随机数据产生握手中的premastersecret,并用server的公钥加密,送回给server,如果server要求验证client身份,则同样需要签名发给server。
- server验证完client身分后,用自己私钥解密得到premastersecret,然后,双方利用这个premastersecret来共同协商,得到mastersecret。
- 双方用master一起产生真正的sessionkey,这就是剩下过程中的对称加密的key了。这个key还可以用来验证数据完整性。双方再交换结束信息,握手结束。
- 接下来双方就可以用协商好的算法和key来使用对称加密算法继续下面的过程了。