GitLab 和 SSH 密钥
Git 是一个分布式版本控制系统,这意味着你可以在本地工作, 然后共享或“推送”您的更改到服务器。 在这种情况下,服务器是 GitLab。
GitLab 使用 SSH 协议来安全地与 Git 通信。 当您使用 SSH 密钥对 GitLab 远程服务器进行身份验证时, 您无需每次都提供用户名和密码。
先决条件
要使用 SSH 与 GitLab 通信,您需要:
- OpenSSH 客户端,预装在 GNU/Linux、macOS 和 Windows 10 上。
- SSH 6.5 或更高版本。 早期版本使用 MD5 签名,这是不安全的。
要查看系统上安装的 SSH 版本,请运行 ssh -V.
支持的 SSH 密钥类型
要与 GitLab 通信,您可以使用以下 SSH 密钥类型:
- ED25519
- RSA
- DSA( 已弃用 在 GitLab 11.0 中 。)
- ECDSA(如 Practical Cryptography With Go 中所述 ,与 DSA 相关的安全问题也适用于 ECDSA。)
管理员可以 限制允许使用的密钥及其最小长度 。
ED25519 SSH 密钥
一书 Go 的实用密码学 表明 ED25519 高效 密钥比 RSA 密钥更安全、更 。
OpenSSH 6.5 在 2014 年引入了 ED25519 SSH 密钥,它们应该在大多数 操作系统。
RSA SSH 密钥
可用文档表明 ED25519 比 RSA 更安全。
如果您使用 RSA 密钥,美国国家科学技术研究所在 出版物 800-57 第 3 部分 (PDF) 建议密钥大小至少为 2048 位。 默认密钥大小取决于您的版本 ssh-keygen. 回顾 man您已安装的页面 ssh-keygen命令了解详情。
查看您是否有现有的 SSH 密钥对
在创建密钥对之前,请查看密钥对是否已存在。
-
在 Windows、Linux 或 macOS 上,转到您的主目录。
-
前往
.ssh/子目录。 如果.ssh/子目录不存在, 你要么不在主目录中,要么你没有使用过ssh前。 在后一种情况下,您需要 生成 SSH 密钥对 。 -
查看是否存在具有以下格式之一的文件:
算法 公钥 私钥 ED25519(首选) id_ed25519.pubid_ed25519RSA(至少 2048 位密钥大小) id_rsa.pubid_rsaDSA(已弃用) id_dsa.pubid_dsaECDSA id_ecdsa.pubid_ecdsa
生成 SSH 密钥对
如果您没有现有的 SSH 密钥对,请生成一个新的。
-
打开一个终端。
-
类型
ssh-keygen -t后跟键类型和可选注释。 此评论包含在.pub创建的文件。 您可能希望使用电子邮件地址进行评论。例如,对于 ED25519:
ssh-keygen -t ed25519 -C "<comment>"对于 2048 位 RSA:
ssh-keygen -t rsa -b 2048 -C "<comment>" -
按 Enter。 将显示类似于以下内容的输出:
Generating public/private ed25519 key pair. Enter file in which to save the key (/home/user/.ssh/id_ed25519): -
接受建议的文件名和目录,除非您正在生成 部署密钥 或者想要保存在您存储其他密钥的特定目录中。
您还可以将 SSH 密钥对专用于 特定主机 。
-
指定 密码 :
Enter passphrase (empty for no passphrase): Enter same passphrase again: -
将显示确认信息,包括有关文件存储位置的信息。
A public and private key are generated. Add the public SSH key to your GitLab account and keep the private key secure.
配置 SSH 以指向不同的目录
如果您没有将 SSH 密钥对保存在默认目录中, 将您的 SSH 客户端配置为指向存储私钥的目录。
-
打开终端并运行以下命令:
eval $(ssh-agent -s) ssh-add <directory to private SSH key> -
将这些设置保存在
~/.ssh/config文件。 例如:# GitLab.com Host gitlab.com PreferredAuthentications publickey IdentityFile ~/.ssh/gitlab_com_rsa # Private GitLab instance Host gitlab.company.com PreferredAuthentications publickey IdentityFile ~/.ssh/example_com_rsa有关这些设置的更多信息,请参阅
man ssh_configSSH 配置手册中的页面。
公共 SSH 密钥对于 GitLab 必须是唯一的,因为它们绑定到您的帐户。 当您使用 SSH 推送代码时,您的 SSH 密钥是您拥有的唯一标识符。 它必须唯一地映射到单个用户。
更新您的 SSH 密钥密码
您可以更新 SSH 密钥的密码。
-
打开终端并运行以下命令:
ssh-keygen -p -f /path/to/ssh_key -
在出现提示时,输入密码并按 Enter。
将您的 RSA 密钥对升级为更安全的格式
如果您的 OpenSSH 版本在 6.5 和 7.8 之间, 您可以更安全地保存您的私人 RSA SSH 密钥 OpenSSH 格式。
-
打开终端并运行以下命令:
ssh-keygen -o -f ~/.ssh/id_rsa或者,您可以使用更安全的加密格式生成新的 RSA 密钥 以下命令:
ssh-keygen -o -t rsa -b 4096 -C "<comment>"
将 SSH 密钥添加到您的 GitLab 帐户
要将 SSH 与 GitLab 结合使用,请将您的公钥复制到您的 GitLab 帐户。
-
复制公钥文件的内容。 您可以手动执行此操作或使用脚本。 例如,要将 ED25519 密钥复制到剪贴板:
苹果系统:
tr -d '\n' < ~/.ssh/id_ed25519.pub | pbcopyLinux (需要
xclip包裹):xclip -sel clip < ~/.ssh/id_ed25519.pubWindows 上的 Git Bash:
cat ~/.ssh/id_ed25519.pub | clip代替
id_ed25519.pub用你的文件名。 例如,使用id_rsa.pub为 RSA。 -
登录 GitLab。
-
在右上角,选择您的头像。
-
选择 首选项 。
-
从左侧边栏中,选择 SSH Keys 。
-
在“ 密钥” 公钥 框中,粘贴 的内容。 如果您手动复制密钥,请确保复制整个密钥, 以
ssh-ed25519要么ssh-rsa,并可能以评论结束。 -
在 标题 文本框中,键入说明,例如 Work Laptop 或 家庭工作站 。
-
可选的。 在 过期时间 框中,选择一个过期日期。 (在 引入 GitLab 12.9 中 。) 到期日期仅供参考,并不妨碍您使用 钥匙。 但是,管理员可以查看到期日期和 时使用它们作为指导 删除键 。
-
选择 添加密钥 。
验证您是否可以连接
验证您的 SSH 密钥是否已正确添加。
-
对于 GitLab.com,为确保您连接到正确的服务器,请确认 SSH 主机密钥指纹 。
-
打开终端并运行此命令,替换
gitlab.example.com使用您的 GitLab 实例 URL:ssh -T git@gitlab.example.com -
如果这是您第一次连接,您应该验证 GitLab 主机的真实性。 如果您看到如下消息:
The authenticity of host 'gitlab.example.com (35.231.145.151)' can't be established. ECDSA key fingerprint is SHA256:HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'gitlab.example.com' (ECDSA) to the list of known hosts.类型
yes并按 Enter。 -
跑过
ssh -T git@gitlab.example.com再次命令。 您应该会收到 欢迎使用 GitLab,@username! 信息。
如果没有出现欢迎消息,您可以通过运行进行故障排除 ssh 在详细模式下:
ssh -Tvvv git@gitlab.example.com
对不同的存储库使用不同的密钥
您可以为每个存储库使用不同的密钥。
打开终端并运行以下命令:
git config core.sshCommand "ssh -o IdentitiesOnly=yes -i ~/.ssh/private-key-filename-for-this-repository -F /dev/null"
此命令不使用 SSH 代理,需要 Git 2.10 或更高版本。 了解更多信息 在 ssh命令选项,请参见 man两个页面 ssh和 ssh_config.
在单个 GitLab 实例上使用不同的帐户
您可以使用多个帐户连接到 GitLab 的单个实例。 您可以使用 的命令执行此操作 上一主题中 。 但是,即使您设置 IdentitiesOnly到 yes,如果出现以下情况,您将无法登录 IdentityFile存在 在一个之外 Host堵塞。
相反,您可以为主机分配别名 ~.ssh/config文件。
- 为了
Host, 使用别名user_1.gitlab.com和user_2.gitlab.com. 高级配置 更难维护,这些字符串更容易 了解何时使用诸如git remote. - 为了
IdentityFile,使用路径私钥。
# User1 Account Identity
Host <user_1.gitlab.com>
Hostname gitlab.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/<example_ssh_key1>
# User2 Account Identity
Host <user_2.gitlab.com>
Hostname gitlab.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/<example_ssh_key2>
现在,克隆一个存储库 user_1, 采用 user_1.gitlab.com在里面 git clone命令:
git clone git@<user_1.gitlab.com>:gitlab-org/gitlab.git
更新别名为的先前克隆的存储库 origin:
git remote set-url origin git@<user_1.gitlab.com>:gitlab-org/gitlab.git
笔记: 私钥和公钥包含敏感数据。 确保权限 在文件上使它们对您可读,但其他人无法访问。
配置两因素身份验证 (2FA)
您可以设置两步验证 (2FA) 通过 SSH 进行 Git 。
在 Eclipse 上使用 EGit
如果您使用 EGit ,您可以 将您的 SSH 密钥添加到 Eclipse 。
在 Microsoft Windows 上使用 SSH
如果您运行的是 Windows 10,则可以使用 的 适用于 Linux Windows 子系统 (WSL) 与 WSL 2 这 两者都有 git和 ssh预安装,或安装 Git for Windows 以 通过 Powershell 使用 SSH。
WSL 中生成的 SSH 密钥不能直接用于 Git for Windows,反之亦然, 因为两者都有不同的主目录:
- WSL:
/home/<user> - 适用于 Windows 的 Git:
C:\Users\<user>
您可以复制 .ssh/目录使用相同的密钥,或在每个环境中生成一个密钥。
替代工具包括:
覆盖 GitLab 服务器上的 SSH 设置
GitLab 与系统安装的 SSH 守护进程集成并指定一个用户 (通常命名为 git) 处理所有访问请求。 用户 通过 SSH 连接到 GitLab 服务器的人由他们的 SSH 密钥标识 他们的用户名。
SSH 客户端 在 GitLab 服务器上执行的 操作是这样执行的 用户。 您可以修改此 SSH 配置。 例如,您可以指定 此用户用于身份验证请求的私有 SSH 密钥。 然而,这种做法 是 不支持 ,并强烈反对,因为它提出显著 安全风险。
GitLab 检查此条件,并指导您 如果您的服务器是这样配置的,请转到本节。 例如:
$ gitlab-rake gitlab:check
Git user has default SSH configuration? ... no
Try fixing it:
mkdir ~/gitlab-check-backup-1504540051
sudo mv /var/lib/git/.ssh/id_rsa ~/gitlab-check-backup-1504540051
sudo mv /var/lib/git/.ssh/id_rsa.pub ~/gitlab-check-backup-1504540051
For more information see:
[Overriding SSH settings on the GitLab server](#overriding-ssh-settings-on-the-gitlab-server)
Please fix the error above and rerun the checks.
尽快删除自定义配置。 这些自定义 是 明确不支持的 ,并且可以随时停止工作。
SSH 连接故障排除
当你跑 git clone,系统可能会提示您输入密码,例如 git@gitlab.example.com's password:. 这表明您的 SSH 设置有问题。
- 确保您正确生成了 SSH 密钥对并添加了公共 SSH 您的 GitLab 个人资料的关键。
- 尝试使用手动注册您的私有 SSH 密钥
ssh-agent. - 尝试通过运行调试连接
ssh -Tv git@example.com. 代替example.com使用您的 GitLab URL。
本文档详细介绍了如何配置和使用GitLab与SSH密钥进行安全通信,包括支持的密钥类型、密钥生成、添加到GitLab账户、验证连接、以及针对不同场景的密钥管理,旨在帮助用户实现高效且安全的版本控制。

1218

被折叠的 条评论
为什么被折叠?



