GitHub Actions Checkout加载SSH密钥Permission denied问题咨询
问题背景
企业防火墙会向HTTPS证书链注入自定义证书,导致HTTPS协议拉取代码时认证失败,因此需要改用SSH密钥方式检出代码仓库,HTTPS认证相关同类问题可参考公开技术社区的对应讨论。
此前使用高权限用户运行GitHub Actions自托管Runner服务时,SSH拉取代码流程可正常工作。现按照官方文档建议,在新部署的服务器上使用内置NetworkService账户运行自托管Runner服务,执行代码检出步骤时触发失败。
工作流配置
使用的工作流配置如下:
- uses: actions/checkout@v3 with: lfs: true ssh-key: ${{secrets.my_private_ssh_key}}
错误日志
执行日志显示密钥加载失败,错误信息如下:
Load key "C:\\actions-runner\\_work\\_temp/d872e64c-0228-457f-9bfa-f9c01b1818ec": Permission denied git@github.com: Permission denied (publickey). Error: fatal: Could not read from remote repository.
已排查信息
- 已查阅大量
git@github.com: Permission denied相关问题资料,未找到密钥加载阶段触发权限拒绝的相关说明。现有公开资料提示,Load Key Permission Denied错误通常是由于运行用户对SSH密钥文件无读取权限导致。 - 按照actions/checkout动作的执行逻辑,运行时会将传入的SSH密钥复制到运行用户的
.ssh目录下供Git调用。NetworkService账户对应的.ssh目录路径为C:\Windows\ServiceProfiles\NetworkService\.ssh,查看该目录时发现目录已创建但为空,推测密钥文件在动作执行完成后被自动清理删除。
待确认疑问
- 为何NetworkService账户对自身写入的密钥文件无访问权限?是否存在其他未被注意到的权限配置问题?
- actions/checkout的ssh-key参数是否支持在NetworkService账户运行环境下正常使用?
- 是否可以配置使用SSH方式检出代码,但不通过secret传入私钥,而是直接将预配置的私钥存储在自托管Runner本地使用?
问题更新
在checkout@v3动作的清理步骤中发现如下警告日志:
Warning: Failed to remove SSH key 'C:\actions-runner\\_work\\_temp\264e2651-1faf-44c3-9fa5-16a842f0d2a4'
但密钥初始配置步骤的日志无任何警告或报错:
::save-state name=sshKeyPath::C:\actions-runner\\_work\\_temp\264e2651-1faf-44c3-9fa5-16a842f0d2a4 ##[debug]Save intra-action state sshKeyPath = C:\actions-runner\\_work\\_temp\264e2651-1faf-44c3-9fa5-16a842f0d2a4 processed file: C:\actions-runner\\_work\\_temp\264e2651-1faf-44c3-9fa5-16a842f0d2a4 Successfully processed 1 files; Failed processing 0 files
查看checkout动作的调试日志可知,执行时SSH密钥会先被复制到临时工作目录,再为计算机账户domain\computer-name$授予该文件的完整权限,该步骤执行日志显示正常,目前无法定位SSH密钥加载时触发权限拒绝的根因。
内容的提问来源于stack exchange,提问作者TJR
相关产品推荐
相关产品推荐

