SSH 密钥管理
您可以将私人 SSH 密钥上传到 TeamCity 项目中。 上传的密钥可用于配置 VCS 根目录,以及在 SSH Agent 构建功能中。
TeamCity 支持 PEM 和 OpenSSH 格式的密钥。 使用不同格式的键需要进行转换。 例如,您可以使用 PuTTY Key Generator将不受支持的 Putty 私钥(*.ppk
)转换为 PEM 格式。 为此,请导航到 转换 | 导出 OpenSSH 密钥 菜单。
要允许 TeamCity 项目通过 SSH URL 访问远程仓库,您首先需要将您的私钥上传到这些项目。
在 项目设置 中,单击 SSH 密钥。
在 SSH 密钥 页面上,单击 上传 SSH 密钥。
在 "上传 SSH 密钥" 对话框中,浏览以查找私钥文件,并为此密钥指定一个名称。
单击 保存 以保存上传的密钥。
您还可以在创建新项目时上传私钥 from repository URLs。 如果您使用 SSH URL,TeamCity 会将 身份验证 模式切换为“SSH 密钥”,并显示之前上传的私钥列表。 如果您之前未上传所需的密钥,请单击 上传 SSH 密钥 并指向 TeamCity 所需的文件。

上传的 SSH 密钥存储在以下目录:
<TeamCity Data Directory>
/config/projects/<project>/pluginData/ssh_keys
如果从“创建项目”页面上传了密钥,TeamCity 会将其分配给创建项目的父项目。 在这种情况下,上传的密钥将保存到以下目录:
<TeamCity Data Directory>
/config/projects/<Parent_Project_ID>/pluginData/ssh_keys
note
保持对 TeamCity 数据目录 的访问安全,因为服务器以未修改 / 未加密的形式在文件系统中存储 SSH 密钥。
如果您使用 GitHub Deploy Keys 或类似的身份验证工作流,则可以让 TeamCity 代替您手动生成 SSH 密钥。 这种方法更为安全(因为生成的密钥不会存储在您的本地机器上)并且速度明显更快。 后者尤其有助于您定期重新生成并轮换 SSH 密钥。
在 项目设置 中,单击 SSH 密钥。
单击 生成 SSH 密钥 按钮。
输入密钥名称,选择密钥类型,然后单击 生成。
如果您需要为新生成的密钥提供私钥或公钥:
私钥存储在
<TeamCity Data Directory>
/config/projects/<parent project>/pluginData/ssh_keys
目录中。公钥可从主 SSH 密钥 页面访问(单击所需密钥下的 复制公钥 链接)。 将此密钥粘贴到您的版本控制服务中(例如,在 GitHub 中:“Repository settings | Deploy Keys | Add deploy key”)。
在您的 TeamCity VCS 根目录的 验证设置 中选择生成的密钥。 为了您的便利,TeamCity 中生成的密钥被放置在一个单独的类别中。
tip
观看我们的 视频教程 ,了解 如何使用 SSH 密钥从 SSH 仓库检出。
当您的 VCS 根配置为通过 SSH URL(例如, git@github.com:...
)与远程存储库一起工作时,才会使用私有 SSH 密钥。 如果您使用 SSH URL 创建项目并从“创建项目”页面选择/上传私钥,TeamCity 会自动设置所需的设置,您无需修改 配置 VCS 根目录。
否则,如果您希望更新通过 token 或 password 进行验证的项目,使其改为使用 SSH key,您将需要手动更新相应的 配置 VCS 根目录。
导航到 管理 | <Your_Project> | VCS Roots 并单击所需根目录旁边的 编辑。
更新 获取 URL 和/或 推送 URL 字段以改用 SSH URL。 例如,将
https://github.com/username/repository_name.git
改为git@github.com:username/repository_name.git
。向下滚动到 验证设置 并选择 私钥 选项之一。
单击页面底部的 测试连接 以检查您当前的值,并单击 Apply 以保存并退出根目录设置。
如果您配置了 代理端签出(agent-side checkout) ,服务器就会将 SSH 密钥传递给代理。 在构建过程中,Git 插件从服务器下载密钥到代理,并在 git fetch/clone
完成后删除该密钥。
note
为了安全原因,密钥已从代理中移除。 例如,构建中执行的测试可能会遗留一些恶意代码,这些代码将会访问构建代理的文件系统并获取密钥。 然而,测试无法直接获取键,因为在运行时它已被移除。 这使得盗取密钥变得更加困难,但并非不可能。 因此,该代理也必须是安全的。
为了将密钥从服务器转移到代理,TeamCity 使用 DES 对称加密对其进行加密。 为了更安全的方式,配置一个 HTTPS 连接,使代理和服务器之间建立连接。
除了 VCS 根目录外,上传的 SSH 密钥还可用于 SSH 代理 构建功能。 查看此链接以获取更多信息: SSH Agent。
TeamCity REST API允许外部应用程序和脚本通过URL访问TeamCity资源。 您可以利用此功能上传 SSH 密钥并自定义 VCS Root 设置。
GET/app/rest/projects/<project_locator>/sshKeys
POST/app/rest/projects/<project_locator>/sshKeys?fileName=<Key_Name>
正文:私钥文件的内容
内容类型头部:"text/plain"
POST/app/rest/projects/<project_locator>/sshKeys/generated?keyName=NewKey&keyType=RSA
keyName
— 任何有效的字符串,即您的新密钥名称。keyType
— 可为 "RSA" 或 "ED25519"。
将 "认证方法" 切换为 "已上传的密钥"。 请求主体:"TEAMCITY_SSH_KEY"。
PUT/app/rest/vcs-roots/<locator>/properties/authMethod
选择一个特定的 SSH 密钥。 请求主体:SSH 密钥名称。
PUT/app/rest/vcs-roots/<locator>/properties/teamcitySshKey
指定密码加密的 SSH 密钥所需的密码。 请求正文:纯密码字符串。
PUT/app/rest/vcs-roots/<locator>/properties/secure:passphrase
DELETE/app/rest/projects/<project_locator>/sshKeys?fileName=<Key_Name>