部署Vapor应用时,如何配置Heroku用SSH密钥读取私有仓库?
Heroku部署Vapor应用私有仓库SSH密钥问题解决办法
问题重现
添加私有GitHub仓库到Vapor应用的Package.swift后,Heroku部署失败,核心报错:
Load key "/app/.ssh/id_rsa": error in libcrypto
git@github.com: Permission denied (publickey).
私有仓库依赖配置:
dependencies: [ .package(url: "git@github.com:MyName/MyRepository.git", branch: "develop") ]
已完成的前置配置:
- 本地密钥文件为
~/.ssh/id_heroku,公钥已在GitHub和Heroku正确配置 - Heroku应用已添加ssh-key构建包,且置于Vapor构建包之前
- 本地
.ssh/config配置了Heroku主机的密钥路径
解决步骤
1. 向Heroku传递私钥内容
Heroku构建环境无法读取本地的.ssh/config,需通过环境变量SSH_KEY传入完整私钥:
heroku config:set SSH_KEY="$(cat ~/.ssh/id_heroku)"
注意:复制私钥时要完整保留开头-----BEGIN OPENSSH PRIVATE KEY-----、结尾-----END OPENSSH PRIVATE KEY-----及中间所有行,不能遗漏或修改格式。
2. 确认构建包优先级
检查ssh-key构建包是否排在Vapor构建包之前:
heroku buildpacks
正常输出应类似:
1. https://github.com/heroku/heroku-buildpack-ssh-key.git 2. https://github.com/vapor/heroku-buildpack.git
若顺序错误,执行以下命令调整:
heroku buildpacks:add --index 1 https://github.com/heroku/heroku-buildpack-ssh-key.git
3. 修复私钥格式问题
若仍出现error in libcrypto,检查私钥是否为标准OpenSSH格式:
- 打开
~/.ssh/id_heroku,确认开头为-----BEGIN OPENSSH PRIVATE KEY----- - 若格式不符,重新生成合规密钥:
ssh-keygen -t ed25519 -f ~/.ssh/id_heroku -C "your-email@example.com"
生成后将新公钥重新添加到GitHub和Heroku平台。
4. (可选)切换为HTTPS仓库地址
若SSH方式仍无法解决,可临时改用HTTPS地址配合GitHub个人访问令牌:
.package(url: "https://<github-token>@github.com/MyName/MyRepository.git", branch: "develop")
将<github-token>替换为具有仓库读取权限的GitHub个人访问令牌,建议通过Heroku环境变量管理令牌,避免硬编码风险。
内容的提问来源于stack exchange,提问作者Roland Lariotte
相关产品推荐
相关产品推荐

