刚刚看到有人问 gcr.io 的镜像问题就想起来以前的没解决的问题。 就是我们自建 harbor 的时候,如果启用了 https,想要用域名访问的时候就要么用证书,要么在 deamon.json 中增加 insecurity 项。
我之前是用 acme 申请的免费证书,直接在 nginx 上配置证书,如果我用命令  docker pull xxx.domian.com/image:latest拉取镜像的时候,会报 x509 错误,如:  x509: certificate signed by unknown authority;如果我用 openssl 生成自签证书,想要正常用的话,也需要把证书手动复制到每台机器上 /etc/docker/cert.d目录下。
而我看比如阿里云他们的镜像源也不需要配置证书就可以直接拉取了,还有我也见过公司合作的厂商也有些的 docker 仓库的域名也不需要特别配置就可以直接拉取,那么他们用的证书是什么样的证书,为啥可以直接通过 docker daemon 的验证,这种证书有免费的吗?
因为我对这块也不熟,查了谷歌跟百度也没有找到答案,所以过来请教一下各位大佬。
|  |      1southwolf      2021-12-22 14:19:05 +08:00 你先确认一下证书申请吧..如果是 ACME 搞的证书 绑好了域名应该不会有问题 | 
|  |      2pydiff OP @southwolf 证书没问题了,直接在页面上访问 harbor,证书也是显示正常的,就是用 docker 拉取镜像时报 x509 错误.同时这个证书用在给其他服务也是正常的 | 
|  |      347jm9ozp      2021-12-22 14:45:16 +08:00 via iPad 没有配置中间证书 | 
|  |      4hxsf      2021-12-22 14:55:07 +08:00 @pydiff #2 如果仅仅是 docker pull 报证书错的情况,可能是运行 docker 的那台机器上的根证书没更新 or 证书链有问题。 一般来说,Linux 上根证书的包叫 ca-certificates , 可以使用包管理更新。然后用 update-ca-trust 命令更新。 然后 docker pull 其实是发命令给 dockerd ,实际的 pull 动作是 dockerd 发起的,你可能还需要重启一下 dockerd 。 | 
|  |      6pydiff OP @ooxxcc 大佬,感谢,解决了,确实是中间证书问题,之前还困扰了好久,好奇别人怎么可以自己搞得不行的 | 
|      7Illusionary      2021-12-22 16:05:15 +08:00 harbor.yml 里面配置好就行了,没那么多乱七八糟 https: port: 443 certificate: /data/harbor/cert/google.com.pem private_key: /data/harbor/cert/google.com.key | 
|  |      8pydiff OP @Illusionary 我之前这样配置也是不行的 | 
|  |      9pydiff OP @Illusionary 再问下,就是 harbor 能不能跟 nexus 一样,我代理 dockerhub 仓库的镜像不用加多一个仓库名,比如 nexus 就可以 ` docker pull xxx.domain.com/redis:latest`,但是我目前用 harbor 就必须要加多一个项目名,比如: ` docker pull xxx.domain.com/proxy/library/redis:latest`,其中 proxy 就是我必须在 harbor 中必须要建的项目,还可以省略多一个个 library | 
|      11stevenhawking      2021-12-23 04:01:31 +08:00 | 
|  |      12pydiff OP @stevenhawking ok ,我试试,谢谢哈 | 
|      13ljf      2021-12-26 20:17:49 +08:00 云服务商的 harbor 里面配置的证书,是通过公共机构签发的可信的证书,所以 docker 登陆和拉取的时候会自动信任,因为 ca 是可信机构。如果是自签的 harbor 证书,那么 ca 是不可信的,因此需要把 ca 证书加到每台客户端的 /etc/docker/cert.d 目录下。 |