Docker加载密钥“ /root/.ssh/id_rsa”:无效格式

时间:2019-12-28 10:20:01

标签: git docker github ssh dockerfile

我正在尝试克隆一个包含子模块的仓库。主存储库克隆正常,但是当我在dockerfile中执行git submodule update --init --recursive时,子模块会抛出错误。

fatal: clone of 'git@github.com:jkeys089/lua-resty-hmac.git' into submodule path '/tmp/third-party/lua-resty-hmac' failed
Failed to clone 'third-party/lua-resty-hmac'. Retry scheduled
Cloning into '/tmp/third-party/lua-resty-jwt'...
load pubkey "/root/.ssh/id_rsa": invalid format
Warning: Permanently added the RSA host key for IP address '140.82.118.3' to the list of known hosts.
Load key "/root/.ssh/id_rsa": invalid format
git@github.com: Permission denied (publickey).

在图片中我有这个

# authorise ssh host
RUN mkdir /root/.ssh/ \
    && chmod 700 /root/.ssh \
    && ssh-keyscan github.com > /root/.ssh/known_hosts

# add key and set permission
RUN echo "${SSH_PRIVATE_KEY}" >> /root/.ssh/id_rsa \
    && echo "$ssh_pub_key" > /root/.ssh/id_rsa.pub \
    && chmod 600 /root/.ssh/id_rsa.pub \
    && chmod 600 /root/.ssh/id_rsa

我无法控制子模块。我不确定是否可以从git@github.com更改为https以获取子模块。

我什至尝试使用GITHUB_TOKEN路线

# start up git and clone
RUN git config --global url."https://${GITHUB_TOKEN}@github.com/".insteadOf "https://github.com/" \
    && git clone https://github.com/GluuFederation/gluu-gateway.git /tmp \
    && cd /tmp/ \
    && git submodule update --init --recursive

以下是构建命令的一部分。 build --build-arg GITHUB_TOKEN=${GITHUB_TOKEN} --build-arg SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)" --build-arg ssh_pub_key="$(cat ~/.ssh/id_rsa.pub)"

请对此提供帮助。非常令人沮丧。 :(

5 个答案:

答案 0 :(得分:2)

另一个可能的陷阱是,如果您使用Makefile运行docker build命令。在这种情况下,Makefile中的命令将类似于:

docker-build:
    docker build --build-arg SSH_PRIVATE_KEY="$(shell cat ~/.ssh/id_rsa)"

Make很遗憾,换行符用空格(make shell

这意味着写入容器的ssh密钥具有不同的格式,从而产生上述错误。

我找不到在Makefile命令中保留换行符的方法,因此我采取了一种解决方法,将.ssh目录复制到docker build上下文中,通过Dockerfile复制文件,然后将其删除。 / p>

答案 1 :(得分:1)

如果密钥为“无效格式”,请尝试使用old PEM format重新生成。

ssh-keygen -m PEM -t rsa -P "" 

请确保将公钥添加到您的GitHub帐户以进行正确的身份验证。

OP Shammir添加in the comments

  

我认为问题是在构建期间没有任何内容从主机复制到docker映像。

在“ docker build --build-arg SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)" returning empty”中,Shammir使用dockito/vault来管理私钥,但也将其配置为“ AddKeysToAgent”:如果私钥不受密码短语的保护,则不需要(例如上面的命令)

答案 2 :(得分:1)

请勿使用 echo "${SSH_PRIVATE_KEY}" >> /root/.ssh/id_rsa 传递私钥(公钥也一样)。我在尝试时遇到了类似的错误 Load key "/root/.ssh/id_rsa": invalid format

RUN echo "$ssh_prv_key" > /root/.ssh/id_rsa &&     chmod 600 /root/.ssh/id_rsa

这导致了 identity file /root/.ssh/id_rsa type -1 invalid formatread_passphrase: can't open /dev/tty 之类的错误。

正确的方法是使用

COPY id_rsa /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa

解决方案说明:我的私钥格式错误 - 不是多行,而是作为一行传递,并且您可能有任何其他格式问题,例如开头或结尾处忘记的“-”,或其他内容行尾有误,例如缺少换行符格式或行尾有额外的字母。

有关详细信息,请参阅 Dockerfile: clone repo with passwordless private key. Errors: “authentication agent” or “read_passphrase: can't open /dev/tty”,其主要思想来自 Add private key to ssh-agent in docker file,其思想再次来自 Gitlab CI/Docker: ssh-add keeps asking for passphrase

答案 3 :(得分:0)

仅供参考。

我手动创建了一个私钥文件 key.id_rsa 并将内容粘贴到其中。但是当我用它来克隆 git 存储库时:

$ git clone my_repo
Cloning into 'my_repo'...
Load key "/path/to/key.id_rsa": invalid format

密钥的内容绝对正确。然后我尝试通过 ssh-keygen 将我的密钥与其他生成的密钥进行比较,这确实是格式无效

只是在我的密钥中没有换行结束

在key的末尾添加新行后,一切都很愉快~太惊喜了!

[更新]:记住即使在 Windows 上也要使用 \n 而不是 \r\n

答案 4 :(得分:0)

此答案适用于 Windows 用户(尚未在 linux 上尝试过)。

我搜索了很多答案和文章,但在构建我的 docker 镜像时仍然遇到无效格式错误。

真正的原因是,当我们将私钥文件的内容作为参数传递时,它们是在一行中传递的。转义字符被转换为空格,这对于密钥来说基本上是无效的格式。为了避免这个错误,有两种方法可以将私钥传递给 docker 镜像:

  1. 在docker文件中使用COPY命令复制私钥文件并在docker镜像中使用。这不是一个好的选择,因为它可能会暴露您的私钥。示例:COPY id_rsa /root/.ssh/id_rsa
  2. 这是我使用过的一种 hack,它奏效了。在文本编辑器中打开私钥文件,并在私钥的每一行末尾添加 \n 并连接每一行以在一行中创建整个密钥。例如,您生成的密钥如下所示:
<块引用>

-----开始打开SSH私钥----- b3BlbnNzaC1redjEAAAAABG5vvmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW QyNTUxOQAAACdmF7/Vo4m2FWPf+8uZRRF88dnsyj+z+lCWNWBrT8gAAAJh1tssodbbL -----结束打开SSH私钥-----

让它看起来像这样:

<块引用>

-----BEGIN OPENSSH 私钥-----\nb3BlbnNzaC1redjEAAAAABG5vvmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW\nQyNTUxOQAAACdmF7/Vo4m2FWPf+8usyWaaacdmF7/Vo4m2FWPf+8usjWaaaaaaaaaaaaaaaaaaaaabag5vvmUAAAAEbm9uZQAAAAAAAAABAAA OPENSSH 私钥-----\n

将其保存在密钥文件中,并在构建 docker 镜像时将修改后的文件传递到参数中。

相关问题