暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DockerRegistry https配置排坑

盛超杰的笔记 2018-06-12
1049

起因

今天我们的Jenkins部署到Rancher的任务突然报错然后百度了一圈,问题的可能性有如下两种然后看了一下宿主机 和 docker容器内的时间一个是CST,一个UTC 那么解决问题的重点在把docker内部镜像时间改为CST的 又是一顿百度在把官方registry镜像封装成新的Dockerfile

  1. From registry

  2. RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

然而还是改变不了这个时区

但是从我现在解决了这个问题之后来推断,Host和docker container内只相差了8个小时,主要还是由于证书过期引起

由于我们是通过域名push镜像到docker私库,并且从docker1.3.2版本开始默认docker registry使用的是https,所以也就是说nginx关于这个域名配置的https的证书过期了

在网上发现可以通过配置

  1. ExecStart=/usr/bin/docker -d --insecure-registry 192.168.1.103:5000  -H fd:// $OPTIONS $DOCKER_STORAGE_OPTIONS  

可以跳过https认证,但是我不知道对域名是否有效

那么直接进入nginx的配置

  1. server {

  2.    listen       80;

  3.    server_name  registry.51juban.cn;


  4.    access_log  /app/logs/nginx/access_registry.51juban.cn_http.log  main;


  5.    location / {

  6.        rewrite ^(.*)$ https://$server_name$1 permanent;


  7. }


  8. }


  9. server {

  10.    listen       443;

  11.    server_name  registry.51juban.cn;

  12.    include      ssl/registry.51juban.cn.conf;


  13.    access_log  /app/logs/nginx/access_registry.51juban.cn_https.log  main;

  14.    client_max_body_size      0;

  15.    chunked_transfer_encoding on;


  16. #    auth_basic "Registry realm";

  17. #    auth_basic_user_file htpasswd;


  18.    location / {

  19.        rewrite ^ /v2/_catalog redirect;

  20.    }


  21.    location /v2/ {

  22.        add_header         'Docker-Distribution-Api-Version' 'registry/2.0';

  23.        proxy_pass         http://127.0.0.1:5500;

  24.        proxy_set_header   Host              $http_host;

  25.        proxy_set_header   X-Real-IP         $remote_addr;

  26.        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;

  27.        proxy_set_header   X-Forwarded-Proto $scheme;

  28.        proxy_read_timeout 1800;

  29.    }

  30. }

这段nginx配置的意思是,http的请求会自动转成https的,https的配置在ssl/registry.51juban.cn.conf中

查看这个registry.51juban.cn.conf文件

  1.    ssl on;

  2.    ssl_certificate ssl/registry.51juban.cn.cer;

  3.    ssl_certificate_key ssl/egistry.51juban.cn.key;

  4.    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

  5.    ssl_protocols TLSv1.1 TLSv1.2;

  6.    ssl_prefer_server_ciphers on;

  7.    ssl_session_timeout 5m;

  8.    ssl_session_cache shared:SSL:10m;

一开始我认为这个证书是openssh生成的 通过openssh的命令查看证书过期时间刚好昨天过期了,那么问题的解决方案就出来了,重新生成https需要的证书

那么就通过openssh去生成证书,证书是生成了,但是浏览器不认,那么我想我这台Jenkins的服务器导入这个证书也行,毕竟我们也不通过浏览器访问

然后是不会玩openssl以及通过linux如何导入证书

一顿迷茫中,然后通过openssl的命令去查看这个证书的信息,发现了

然后百度了一下,发现了这个造福人类的免费https证书

Let's Encrypt获取免费证书

Let's Encrypt 是国外一个公共的免费SSL项目,由 Linux 基金会托管,它的来头不小,由 Mozilla、思科、Akamai、IdenTrust 和 EFF 等组织发起,目的就是向网站自动签发和管理免费证书,以便加速互联网由 HTTP 过渡到 HTTPS,目前 Facebook 等大公司开始加入赞助行列。

Let's Encrypt 已经得了 IdenTrust 的交叉签名,这意味着其证书现在已经可以被 Mozilla、Google、Microsoft 和 Apple 等主流的浏览器所信任,用户只需要在 Web 服务器证书链中配置交叉签名,浏览器客户端会自动处理好其它的一切,Let's Encrypt 安装简单,使用非常方便。

先下载Let's Encrypt的客户端

  1. wget https://dl.eff.org/certbot-auto

  2. chmod a+x certbot-auto

然后开始进行配置

  1. ./certbot-auto certonly -d 你的域名 --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory

有2个步骤需要注意下,邮箱邮件确认,以及配置特定dns解析进行验证

  1. Please deploy a DNS TXT record under the name

  2. _acme-challenge.www.shengchaojie.com with the following value:


  3. Eal-gPmNRTmLAods1r0sfNRGQqgggGPUCYWMp3bnZ6Y


  4. Before continuing, verify the record is deployed.

你需要在你域名的dns解析配置这个二级域名的TXT解析,配置完成后在continue 成功之后会在一个文件夹把对应的证书生成,有如下4个然后在nginx SSL模块修改对应配置

  1. ssl_certificate /etc/letsencrypt/live/registry.51juban.cn-0001/fullchain.pem;

  2. ssl_certificate_key /etc/letsencrypt/live/registry.51juban.cn-0001/privkey.pem;

fullchain.pem对应证书 privkey.pem对应私钥

具体原理就是浏览器会从证书的发行机构去获取公钥加密http报文,然后服务器用私钥解密,由证书结构给浏览器提供公钥,就避免了黑客中途修改证书的可能性

由于这个证书只有三个月的有效期,所以我们可以起一个定时任务去刷新,官方也提供了刷新证书的api 刷新证书命令如下

  1. ./path/to/certbot-auto renew

renew命令在证书不过期的情况下不会做任何操作,所以我们弄一个定时任务每天调用2次。 新建https_cron文件,内容如下

  1. 0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && ./certbot-auto renew

然后使用crontab https_cron启动定时任务即可

总结

运维的套路很多。。。 get免费https证书套路 官方文档很给力,学习劲量看官方文档吧,不过英语真的没耐心看


文章转载自盛超杰的笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论