企业防火墙禁用22端口时Dockerfile添加GitLab SSH公钥到known_hosts问题
Docker构建时GitLab SSH主机身份校验解决方案
根因说明
你之前执行ssh-keyscan失败的核心原因是:SSH配置中将gitlab.com的访问实际映射到了altssh.gitlab.com:443,但gitlab.com域名的443端口仅提供HTTPS服务,没有监听SSH服务,所以扫描请求会直接无响应。
可用方案
- 方案1:修正
ssh-keyscan扫描目标
直接扫描GitLab 443端口SSH服务对应的实际域名即可,修改对应Dockerfile行:
该方案动态拉取官方公钥,适合公钥可能调整的场景,仅要求构建节点网络可连通RUN ssh-keyscan -p 443 altssh.gitlab.com >> ~/.ssh/known_hostsaltssh.gitlab.com:443。 - 方案2:拷贝本地合法的known_hosts文件到镜像
可行性:完全可行,只要本地known_hosts中已经存储了altssh.gitlab.com:443对应的正确公钥即可正常校验。
安全性:只要本地公钥是你此前正常连接GitLab时生成、未被篡改的,就不存在中间人攻击风险,反而比构建时动态拉取更稳定,不受构建节点的网络访问限制。
对应Dockerfile写法参考:COPY docker/config/known_hosts /root/.ssh/known_hosts RUN chmod 0600 /root/.ssh/known_hosts - 方案3:硬编码GitLab公开公钥到镜像
你可以提前从本地正常连接后的known_hosts文件中复制altssh.gitlab.com:443对应的公钥行,直接写入镜像的known_hosts文件,无需依赖网络扫描也无需拷贝本地文件,稳定性最高:RUN echo '[altssh.gitlab.com]:443 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP4HbQv8eKfUCr7mZbMl4jT5v4oWb2w11aU08RrQkfM' >> ~/.ssh/known_hosts # 可根据需求补充RSA等其他加密算法的公钥行
注意事项
你使用的--mount=type=ssh是透传宿主机SSH代理的安全方案,不会将私钥打包到镜像中,只要镜像内的known_hosts配置正确,就可以正常完成主机身份校验,执行私有仓库克隆操作。
内容的提问来源于stack exchange,提问作者Roel van Endhoven
相关产品推荐
相关产品推荐

