Linux下私有仓库harbor的搭建部署之https的方式访问Web Ui(二)(docker版本:18.06.1-ce)
续我的上篇博文:https://mp.****.net/postedit/88723940
部署 SSL 认证(使用https的方式访问Web Ui)
配置服务端(server1):
1、概念理解
1、签名证书与自签名证书
- 签名证书:由权威颁发机构颁发给服务器或者个人用于证明自己身份的东西
- 自签名证书:由服务器自己颁发给自己,用于证明自己身份的东西,非权威颁发机构发布
2、openssl
openssl 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的**和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用3、KEY与CSR的区别
- Key通常用来存放一个公钥或者私钥,并非X.509证书,编码同样的,可能是PEM,也可能是DER。证书自身拥有一个**对(即一个公钥和一个私钥),由公钥(Public Key)与私钥(Private Key)是通过一种算法得到,公钥是**对中公开的部分,私钥则是非公开的部分。一般公钥和**的关系为:1,公钥和私钥成对出现、2,公开的**叫公钥,只有自己知道的叫私钥、3,用公钥加密的数据只有对应的私钥可以解密、4,用私钥加密的数据只有对应的公钥可以解密、5,如果可以用公钥解密,则必然是对应的私钥加的密、6,如果可以用私钥解密,则必然是对应的公钥加的密。
- CSR文件必须在申请和购买SSL证书之前创建。也就是证书申请者在申请数字证书时由CSP(加密服务提供者)在生成私钥的同时也生成证书请求文件,证书 申请 者只要把CSR文件提交给证书颁发机构后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件,也就是颁发给用户的证书
2 、下载并安装docker-compose (上篇博文已经做过)
3、下载并安装harbor(这里下载在线安装包)——上篇博文已经做过
4、修改 Harbor 的配置文件 hardor.cfg——>上篇博文已经修改过hostname。
[[email protected] harbor]# pwd
/root/harbor
[[email protected] harbor]# vim harbor.cfg
9 ui_url_protocol = https #修改成https
#查看认证文件的路径
24 ssl_cert = /data/cert/server.crt
25 ssl_cert_key = /data/cert/server.key
5、创建根证书
<1> 创建证书存放目录
[[email protected] harbor]# mkdir /data/cert #harbor.cfg文件中指定的目录
[[email protected] harbor]# cd /data/cert
<2>创建根证书私钥(不使用第三方权威机构的CA来认证,自己充当CA的角色)
[[email protected] cert]# openssl genrsa -out ca.key 2048 #生成根证书私钥(无加密),必须在cert目录中操作
Generating RSA private key, 2048 bit long modulus
.......................................+++
..............+++
e is 65537 (0x10001)
[[email protected] cert]# ls
ca.key
<3>生成自签名证书(使用已有私钥ca.key自行签发根证书)
[[email protected] cert]# openssl req -x509 -new -nodes -key ca.key -days 10000 -out ca.crt -subj "/CN=Harbor-ca" #必须在cert目录中操作
[[email protected] cert]# ls
ca.crt ca.key
6、创建服务器端证书并签发服务器证书
<1>创建服务器端证书
[[email protected] cert]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout server.key -out server.csr #一路回车。必须在cert目录中操作
#注意如果是域名,比如chen.org,那么需要写入chen.org
Common Name (eg, your name or your server's hostname) []:chen.org
<2>签发服务器证书
[[email protected] cert]# echo subjectAltName = IP:172.25.83.1 > extfile.cnf #必须在cert目录中操作。如果是域名,比如chen.org,那么这步是不需要的。
[[email protected] cert]# ls
ca.crt ca.key extfile.cnf server.csr server.key
[[email protected] cert]# openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 365 -extfile extfile.cnf -out server.crt #必须在cert目录中操作。如果是域名,比如chen.org,那么这步中把参数-extfile extfile.cnf去掉即可
Signature ok
subject=/C=XX/L=Default City/O=Default Company Ltd
Getting CA Private Key
[[email protected] cert]# ls
ca.crt ca.key ca.srl extfile.cnf server.crt server.csr server.key
#参数解释
x509:签发X.509格式证书命令。
-req:表示证书输入请求。
-in filename:表示输入文件,这里为server.csr
-out filename:表示输出文件,这里为server.crt
-days:表示有效天数
-extensions 表示按OpenSSL配置文件v3_req项添加扩展。
-CA certname:表示CA证书,这里为ca.crt
-CAkey keyname:表示CA证书**,这里为ca.key
-CAcreateserial:表示创建CA证书***
-extfile filename:指定文件
7、设置 docker 证书
<1>创建目录
# 如果如下目录不存在,请创建。
mkdir -p /etc/docker/certs.d/172.25.83.1
#如果是域名,比如chen.org,请创建下面的目录
# mkdir -p /etc/docker/certs.d/chen.org
# 如果端口为443,则不需要指定。如果为自定义端口,请指定端口
# /etc/docker/certs.d/yourdomain.com:port
[[email protected] cert]# mkdir -p /etc/docker/certs.d/172.25.83.1
<2>将 ca 根证书和服务器证书依次复制到上述创建的目录中
cp ca.crt /etc/docker/certs.d/172.25.83.1 #如果是域名,比如chen.org。cp ca.crt /etc/docker/certs.d/chen.org
cp server.crt /etc/docker/certs.d/172.25.83.1 #如果是域名,比如chen.org。cp server.crt /etc/docker/certs.d/chen.org
[[email protected] cert]# pwd
/data/cert
[[email protected] cert]# cp ca.crt /etc/docker/certs.d/172.25.83.1/
[[email protected] cert]# cp server.crt /etc/docker/certs.d/172.25.83.1/
8、确保80端口和443端口没有容器或服务在占用(因为启动harbor时所产生的服务要占用80端口和443端口)——上篇博文已经做过
9、重启 docker 和 启动 Harbor
[[email protected] cert]# systemctl restart docker
[[email protected] cert]# cd /root/harbor/
[[email protected] harbor]# ./install.sh
10、web界面查看
启动完成后,我们访问刚设置的 hostname 即可 https://172.25.83.1/,默认是443端口,如果端口占用,我们可以去修改docker-compose.yml文件中,对应服务的端口映射
点击Advanced
点击Add Exception
点击Confirm Security Exception
我们可以点击,右上角的English,将字体调整为中文
默认用户名和密码是:admin/Harbor12345
其中my_harbor是上篇博文添加的私有项目
11、修改文件/usr/lib/systemd/system/docker.service,并重启docker服务(将之前增加的--insecure-registry=172.25.83.1删除)
[[email protected] harbor]# vim /usr/lib/systemd/system/docker.service
12 ExecStart=/usr/bin/dockerd
[[email protected] harbor]# systemctl daemon-reload
[[email protected] harbor]# systemctl restart docker
12、后台登录——>上篇博文登录过,所以/root/.docker/config.json文件中有记录,所以这里不用再次登录。
13、上传镜像172.25.83.1/my_harbor/rhel7:nginx3
[[email protected] ~]# docker tag rhel7:nginx3 172.25.83.1/my_harbor/rhel7:nginx3
[[email protected] .docker]# docker push 172.25.83.1/my_harbor/rhel7:nginx3
The push refers to repository [172.25.83.1/my_harbor/rhel7]
a58cd834c342: Pushed #显示Pushed表示上传成功
18af9eb19b5f: Pushed
nginx3: digest: sha256:cd2d6a5c6e56c4d021dc9343118ca8aa7f80c2bbfdc0bddc0cb414ef529e8918 size: 739
push镜像成功之后,然后在web界面上查看镜像是否存在
可以看到之前上传的镜像,表示配置成功。
web界面看到的内容,也就是之前上传的镜像(172.25.83.1/my_harbor/rhel7:nginx3)。该内容和/data/registry(/data目录在harbor.cfg文件中指定过)的内容是同步的。也就是说,如果将/data/registry目录下的内容删除,web界面也就看不到相应的内容了,同时pull会失败。
注:其他服务器如果需要访问 Harbor 仓库,把 /etc/docker/certs.d/192.168.80.42 文件夹复制到该主机的相同位置即可
客户端测试(物理机):
在下载之前,
我们需要先获取harbor仓库类的镜像:
以及获取某个镜像的标签列表:
<1>修改文件/usr/lib/systemd/system/docker.service,并重启docker服务(将之前增加的--insecure-registry=172.25.83.1删除)
[[email protected] ~]# vim /usr/lib/systemd/system/docker.service
12 ExecStart=/usr/bin/dockerd
[[email protected] ~]# systemctl daemon-reload
[[email protected] ~]# systemctl restart docker
<2>获取证书
[[email protected] ~]# mkdir /etc/docker/certs.d/172.25.83.1 -p #目录的名字必须是这个
[[email protected] 172.25.83.1]# scp ca.crt server.crt [email protected]:/etc/docker/certs.d/172.25.83.1/ #将server1上的ca.crt文件和server.crt文件复制到物理机的/etc/docker/certs.d/172.25.83.1目录下
<3>登录172.25.83.1——>上篇博文登录过,所以/root/.docker/config.json文件中有记录,所以这里不用再次登录。
<4>下载镜像172.25.83.1/my_harbor/rhel7:nginx3
[[email protected] ~]# docker pull 172.25.83.1/my_harbor/rhel7:nginx3
nginx3: Pulling from my_harbor/rhel7
48f5bbc9baf5: Already exists
101320d6419d: Pull complete #显示Pull complete表示pull成功
Digest: sha256:cd2d6a5c6e56c4d021dc9343118ca8aa7f80c2bbfdc0bddc0cb414ef529e8918
Status: Downloaded newer image for 172.25.83.1/my_harbor/rhel7:nginx3
##如果看不惯镜像172.25.83.1/my_harbor/rhel7:nginx3这个名字,可以改名字
[[email protected] ~]# docker tag 172.25.83.1/my_harbor/rhel7:nginx3 rhel7:nginx3
[[email protected] ~]# docker rmi 172.25.83.1/my_harbor/rhel7:nginx3
服务端可以上传镜像,也可以下载镜像(这里不再演示,同客户端的pull);客户端如果登录了,当然可以上传镜像(这里不再演示,同服务端的push),也可以下载镜像。