docker 的这段代码有什么用的?

2017-11-07 16:08:02 +08:00
 xoxo419
ENV GPG_KEYS 0B96609E270F565C13292B24C13C70B87267B52D 0A95E9A026542D53835E3F3A7DEC4E69FC9C83D7 0E604491
RUN set -xe \
  && for key in $GPG_KEYS; do \
    gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
  done
2996 次点击
所在节点    问与答
9 条回复
hljjhb
2017-11-07 18:14:05 +08:00
导入 gpg 公钥
xoxo419
2017-11-07 21:25:16 +08:00
@hljjhb 这个公钥是从哪里获取的呢?
hljjhb
2017-11-07 21:31:24 +08:00
@xoxo419 参数里的 keyserver
cy97cool
2017-11-07 21:31:42 +08:00
@xoxo419 你可以去了解 gpg 和 openpgp,用来做安全地加密、签名验证

公钥服务器就在命令里面 ha.pool.sks-keyservers.net
xoxo419
2017-11-07 21:58:44 +08:00
@hljjhb
@cy97cool

我是从这个文件 https://github.com/helderco/docker-php-5.3/blob/master/Dockerfile 里看到的
是为了对这个文件的安全加密?

我知道这段是对文件的完整校验, 那上面的 gpg 公钥和下面这段校验没有关系?

```
&& curl -SL "http://php.net/get/php-$PHP_VERSION.tar.xz/from/this/mirror" -o php.tar.xz \
&& curl -SL "http://php.net/get/php-$PHP_VERSION.tar.xz.asc/from/this/mirror" -o php.tar.xz.asc \
&& gpg --verify php.tar.xz.asc \
```
cy97cool
2017-11-08 00:52:32 +08:00
当然有关系 asc 文件是签名文件,这句话就会使用已经存在的密钥检查下载到的文件是不是拥有合法的签名;假设下载过程出错了,这个验证就通不过,整个 Docker build 流程到这里就出错退出

不如再查查 gpg 的 man 文档: https://explainshell.com/explain?cmd=gpg+--verify+php.tar.xz.asc

如果你想知道签名者的身份,可以用 https://pgp.mit.edu/ 查询密钥信息,如: http://pgp.mit.edu/pks/lookup?search=0x0B96609E270F565C13292B24C13C70B87267B52D&op=index
cy97cool
2017-11-08 00:56:55 +08:00
如果攻击者劫持了你从 php.net 的下载 tar.xz 和 tar.xz.asc 的请求,他想通过篡改你下载到的 php 压缩包来给你种上后门,他也并不能产生一个被你`gpg --verfiy`信任的文件和签名,也就不能通过验证 出错退出

问题来了,前面的从 key server 获取公钥能不能劫持 进行中间人攻击呢?
xoxo419
2017-11-08 08:10:36 +08:00
@cy97cool 原来作用这样的. 感谢!
xoxo419
2017-11-08 08:52:27 +08:00
@cy97cool #7 [维基百科]( https://zh.wikipedia.org/wiki/PGP) 上的这句 "不管是在加密消息时还是在验证签名时,都需要注意用来发送消息的公钥是否确实属于期望的接收者." 是做不了中间攻击的. PS: 我猜的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/404337

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX