Github Action执行时遇到SSH key invalid format错误

Github Action是款非常不错的CI/CD工具,自从它问世以来发展的速度真可谓是快,在 Github 的官方市场中几乎能找到所有你想要使用的Action脚本进行引用。本博客也是基于Github Action进行远程部署的,与常规的Github Pages服务不同,本站的静态文件是部署在国内某云厂商的静态服务器上面的,通过 tzzs/server-shell Action 集成,实现远程执行服务端的命令,来拉取最新生成的静态文件。

具体的Github Action脚本用法参考如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
deploy-cloud:
  runs-on: ubuntu-latest
  steps:
    - name: Deploy Remote Cloud
      uses: tzzs/server-shell@v3
      with:
        IP: ${{ secrets.REMOTE_HOST }}
        USERNAME: ${{ secrets.REMOTE_USER }}
        PRIVATE_KEY: ${{ secrets.REMOTE_PRIVATE_KEY }}
        SHELL:
          "sh /home/develop/myblog-deploy.sh"

这看上去也没有任何的问题,将代码推送到Github仓库也能正常运行。但诡异的事情在大概运行 1 周时间后便出现。在没有调整过 Action 脚本及 SSH 私钥的情况下,上面的部署步骤竟然执行失败,报出如下的错误信息:

1
2
3
4
5
6
7
/usr/bin/ssh server sh /home/***/myblog-deploy.sh
Warning: Permanently added '***' (ECDSA) to the list of known hosts.
Load key "/home/runner/.ssh/deploy.key": invalid format
Permission denied, please try again.
Permission denied, please try again.
***@***: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
Error: Error: The process '/usr/bin/ssh' failed with exit code 255

持着怀疑的态度再次检查了下最新仓库代码,确定只是发布了新文章并没调整过配置文件。然后又直接执行ssh -i命令测试了下 SSH 私钥,也是能正常的连接远程服务,这就有点纳闷的啦,到底是哪里出问题呢?

经过一番网络大战(借助搜索引擎查找资料)后,发现有人提到说检查下 SSH 私钥的类型是否为 RSA 格式,打开的本地生成的id_rsa文件查看内容,果然不是RAS类型,参考如下:

1
2
3
-----BEGIN OPENSSH PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END OPENSSH PRIVATE KEY-----

大概是早期生成SSH key没有留意直接使用了默认规则,然后使用如下的命令对私钥进行转换:

1
ssh-keygen -m PEM -t rsa -f ~/.ssh/id_rsa

将新生成的私钥进行重新分发,再重新re-load失败的 Action, 果然任务就能正常执行成功。

问题到此是解决了,不过对其的产生还是有些困惑,之前为何就没有这样的情况出现?又仔细过了一遍远程部署的脚本代码,发现执行时需要指定服务器操作系统版本 runs-on: ubuntu-latest ,而这里写的是使用最新版本,估计问题就是在此产生的,猜测可能是最新版本服务器操作系统的OPENSSH是版本较高不兼容所导致的,但没有做进一步的验证。

总结一点,就是生成SSH私钥时还是尽量按照服务方的要求进行操作,如果没有,那么建议还是使用PEM格式的RSA类型较为通用,能够避免未知的风险。 😄