Git中认识SSH

本文深入解析SSH认证机制,包括git服务器的SSH配置流程,从客户端逻辑到服务器认证过程,以及常见异常排查方法。涵盖SSH配置、公私钥生成、授权密钥设置及HTTPS与SSH协议在GitLab中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:
- git服务器:git.xxx.com
- 认证方式:ssh
- ssh key:.ssh/id_rsa

笔者个人理解的 ssh {user}@{server} 过程:
// Host git.xxx.com
//  User {other}
//  IdentityFile ~/.ssh/id_rsa

// this is client logic
config = find_config(server)
// config: {"User": other, "IdentityStr": read("IdentityFile")} .etc
if config is not null:
	body = {"to": user}.extend(config)
	request(server, body)

body = receive(request)
user, other, IdentityStr = body["to"], config["User"], config["IdentityStr"]

// this is server logic
auth_keys = read("/home/$other/.ssh/authorized_keys")
if IdentityStr is not null && IdentityStr in auth_keys:
	auth(IdentityStr, random())
else:
	response(server_public_key, "please input password")
以下现象理解

未配置.ssh/config

  • ssh {user}@git.xxx.com

    {user}@git.xxx.com’s password:

    Client未找到git.xxx.com的配置信息,即发送空请求,Server将采取口令认证

  • ssh git@git.xxx.com

    git@git.xxx.com’s password:

    Client未找到git.xxx.com的配置信息,即发送空请求,Server将采取口令认证

已配置config

  • ssh {user}@git.xxx.com

    {user}@git.xxx.com’s password:

    Client找到git.xxx.com的配置信息,并发送包含认证信息的请求
    但是Server端没有在/home/{user}/.ssh/authorized_keys中找到匹配的项,于是采取口令认证

  • ssh git@git.xxx.com

    PTY allocation request failed on channel 0
    Welcome to GitLab, @{user}!
    Connection to git.xxx.com closed.

    Client找到git.xxx.com的配置信息,并发送包含认证信息的请求
    并且Server端在/home/git/.ssh/authorized_keys中找到匹配的项,于是公私钥认证,最后认证通过

ssh 命令

ssh [-i identity_file] [-l login_name] [user@]host[:port]

注意点

当ssh出现异常时,通常注意检查一下几点

  • local: config(登入配置):登入至哪个用户,以什么身份登入,登入时使用的认证私钥
  • server: authorized_keys(是否 允许 认证)
  • local: know_hosts(服务器IP调整时)
gitlab使用时的配置

gitlab开始使用时 – 注意协议:SSH | HTTPS
gitlab 之 SSH

  1. ssh-keygen -t rsa -C “comment” -f filename
  2. 添加 xxx.pub 至 服务端(gitlab)上
  3. 配置 .ssh/config 添加 对应host的配置
  4. 使用

gitlab 之 HTTPS

  1. git config --global http.sslVerify “false”
  2. 正常使用
<think>嗯,用户想要在Linux系统上配置GitSSH密钥。从用户提供的参考资料来看,ta应该已经看过Windows和macOS的相关说明,现在需要Linux的指导。用户可能是个开发者,正在搭建Linux开发环境,或者准备在服务器上部署代码。注意到参考资料里给出了ssh-keygen的基本用法,但用户特别强调是Linux环境,所以需要补充Linux特有的细节。比如权限管理(600权限)、密钥存放路径(~/.ssh/),以及可能遇到的selinux问题。用户没有提到具体Git平台(GitHub/GitLab等),所以需要给出通用方案。但可以提示平台差异,比如GitHub要求公钥标题不能包含#号等特殊字符(从引用[1][2][4]看用户邮箱是用#号注释的,需要提醒)。另外,引用[3]提到多账号配置,引用[5]提到客户端整合,虽然用户当前问题集中在密钥生成,但可以预判下一步需求。所以回答里要包含:密钥生成(核心需求)->添加公钥到平台(必要步骤)->多密钥管理(延伸需求)->客户端测试(验证环节)的完整链条。特别注意引用[4]提到默认路径处理,Linux和macOS相似,但用户可能不熟悉波浪号~代表家目录的概念,需要明确写成/home/用户名/。还有权限设置chmod600这些Windows不需要但Linux必备的操作。最后补充Git配置环节(引用[3][5]),因为生成密钥后必须关联到Git。这里要区分全局配置和项目级配置,避免用户混淆。测试部分强调ssh-T验证,比gitpull/push更安全直观。</think> 好的,在Linux系统中为Git配置SSH密钥主要涉及以下几个步骤,整个过程在终端中完成: ### 📌 步骤 1: 生成 SSH 密钥对 (如果还没有) 1. **打开终端。** 2. **输入生成密钥的命令:** ```bash ssh-keygen -t rsa -b 4096 -C "你的邮箱地址@example.com" # 引号里换成你在Git服务(GitHub/GitLab等)注册的邮箱 ``` * `-t rsa`: 指定密钥类型为 RSA(现在推荐4096位或Ed25519)。 * `-b 4096`: 指定密钥长度为 4096 位(更安全)。 * `-C "your_email@example.com"`: 提供一个注释,通常是你的邮箱📧,方便标识密钥所有者。这个注释会嵌入在公钥文件的末尾。[^1][^2][^4] 3. **保存密钥文件:** * 系统会提示你输入保存密钥对的文件路径。 ``` Enter file in which to save the key (/home/你的用户名/.ssh/id_rsa): ``` * **强烈建议按 `Enter` 键使用默认路径 (`~/.ssh/id_rsa`)。** 这是SSH客户端寻找私钥的标准位置,后续配置会更简单。[^4] 4. **设置密钥密码 (可选但推荐):** * 系统会提示: ``` Enter passphrase (empty for no passphrase): ``` * 输入一个安全密码并确认。这为私钥增加了一层保护。每次使用私钥时都需要输入此密码(也可以通过 ssh-agent 管理,见步骤 3)。 * 如果不想设置密码,直接按 `Enter` 两次。 5. **完成生成:** * 命令执行后,你会在屏幕上看到类似的信息,显示密钥的指纹和随机艺术图案: ``` Your identification has been saved in /home/你的用户名/.ssh/id_rsa Your public key has been saved in /home/你的用户名/.ssh/id_rsa.pub The key fingerprint is: SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 你的邮箱地址@example.com The key's randomart image is: +---[RSA 4096]----+ | | ... (图形) ... | | +----[SHA256]-----+ ``` ### 🔐 步骤 2: 确保 SSH Agent 运行并添加私钥 (可选,简化使用) SSH Agent 是一个在后台运行的程序,用于管理SSH私钥。添加后,输入一次密码后即可记住,无需每次使用都输入密码。 1. **启动 SSH Agent:** ```bash eval "$(ssh-agent -s)" ``` * 这会输出代理的进程ID (PID),例如 `Agent pid 12345`。 2. **将你的私钥添加到 SSH Agent:** ```bash ssh-add ~/.ssh/id_rsa # 如果使用了默认路径和文件名 ``` * 如果你在生成密钥时指定了不同的文件名或路径,请将 `~/.ssh/id_rsa` 替换为你的私钥文件的实际路径。 * 如果你设置了密码,系统会提示你输入一次。 * 成功后会显示 `Identity added: /home/你的用户名/.ssh/id_rsa (你的邮箱地址@example.com)`。 > **注意:** 如果使用了非默认密钥,需要在 Git 操作时指定私钥(可参考 `core.sshCommand` 配置),但在配置好 `ssh-agent` 并使用默认密钥位置的情况下通常不需要。 ### 📤 步骤 3: 将公钥添加到你的 Git 托管服务 (GitHub, GitLab, Gitee 等) 这一步至关重要,让远程服务器认识你本地的公钥。 1. **复制公钥内容:** * 使用 `cat` 命令查看并复制公钥文件内容 (`id_rsa.pub`): ```bash cat ~/.ssh/id_rsa.pub ``` * 公钥文件内容类似这样:`ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDeq4w...很长一串... your_email@example.com` * **完整选中并复制** 终端中输出的全部内容(从 `ssh-rsa` 开始,到你的邮箱结束)。**非常重要:不能有空格缺失或多余字符。** * 或者,你也可以用鼠标右键复制。使用 `xclip` 可以更方便地将公钥直接复制到剪贴板(如果已安装): ```bash xclip -sel clip < ~/.ssh/id_rsa.pub # Ubuntu/Debian等通常需要先安装xclip: `sudo apt install xclip` ``` 2. **登录到你的 Git 服务网站 (如 GitHub, GitLab, Gitee):** 3. **找到添加 SSH Key 的地方:** * **GitHub:** 点击右上角头像 -> `Settings` -> 侧边栏 `SSH and GPG keys` -> `New SSH key`. * **GitLab:** 点击右上角头像 -> `Preferences` -> 左侧 `SSH Keys`. * **Gitee:** 点击右上角头像 -> `设置` -> `SSH公钥`. 4. **添加公钥:** * **Title/标题/备注:** 起一个你能识别的名字(如 `Home Linux Laptop`, `Work Desktop`)。 * **Key Type/类型:** 通常保持默认的 `Authentication Key` (认证密钥)。 * **Key/公钥:** 将你刚刚复制的整个公钥字符串粘贴到这个输入框中。 * **确认添加/保存。** 有些平台可能要求你输入账户密码再次确认。 ### ⚙ 步骤 4: 测试 SSH 连接是否成功 这是验证你配置是否正确的关键一步。 ```bash ssh -T git@github.com # 测试连接到 GitHub # 或者 ssh -T git@gitlab.com # 测试连接到 GitLab # 或者 ssh -T git@gitee.com # 测试连接到 Gitee # ... 用你对应的服务地址 ``` * **第一次连接**:会看到关于主机真实性的警告 (RSA key fingerprint)。如果你信任该主机(像 GitHub/GitLab 这种大型服务一般可信),请输入 `yes` 并回车将其加入到你的已知主机列表 (`~/.ssh/known_hosts`)。 * **成功的连接:** * **GitHub:** 如果提示中包含你的 GitHub 用户名,表示成功。类似:`Hi username! You've successfully authenticated, but GitHub does not provide shell access.` * **GitLab:** 类似:`Welcome to GitLab, @username!` * **Gitee:** 类似:`You've successfully authenticated, but GITEE.COM does not provide shell access. Welcome to Gitee.com, Your Name!` * **失败连接:** 如果提示 `Permission denied (publickey)`,请仔细检查上述所有步骤,尤其是公钥是否正确复制粘贴到服务器、私钥是否加载到代理(或使用正确路径)、文件权限是否正确(下一步)。 ### 🔒 (重要!) 步骤 5: 检查和设置正确的文件权限 (Linux 安全要求) SSH 对密钥文件的权限要求非常严格,权限过大可能会导致 SSH 拒绝工作。 1. **检查 `.ssh` 目录权限:** 它应该是 `700` (drwx------) ```bash ls -ld ~/.ssh # 输出应类似 drwx------ 2 username username 4096 月 日 时间 /home/username/.ssh ``` 如果权限不对,修复: ```bash chmod 700 ~/.ssh ``` 2. **检查私钥文件 (`id_rsa`) 权限:** 它必须是 `600` (-rw-------) ```bash ls -l ~/.ssh/id_rsa # 输出应类似 -rw------- 1 username username 3381 月 日 时间 /home/username/.ssh/id_rsa ``` 如果权限不对,修复: ```bash chmod 600 ~/.ssh/id_rsa ``` 3. **检查公钥文件 (`id_rsa.pub`) 和其他配置文件权限:** 可以是 `644` (-rw-r--r--) ```bash ls -l ~/.ssh/id_rsa.pub # 确保至少所有者有读写权限 chmod 644 ~/.ssh/id_rsa.pub # 如果需要设置权限 ``` 配置文件如 `config`: ```bash chmod 644 ~/.ssh/config # 如果需要设置 ``` ### 🔧 步骤 6: 配置 Git 使用 SSH (通常是默认设置) 完成 SSH 密钥配置并成功测试连接后,Git 在克隆、推送、拉取时就会自动尝试使用配置好的 SSH 密钥。**大多数情况下不需要额外配置 Git 本身。** * **克隆仓库时使用 SSH URL:** 确保你克隆仓库时使用的是仓库的 **SSH URL**(格式如 `git@github.com:username/repo.git`),而不是 HTTPS URL(格式如 `https://github.com/username/repo.git`)。 * **如果使用了非默认密钥路径或需要额外参数:** 你可能需要像引用 [3] 中提到的那样配置 Git 来指定 `ssh` 命令。但 **使用默认位置 (`~/.ssh/id_rsa`)** 并配置好 `ssh-agent` 的情况下,**绝大多数情况不需要这个额外配置**。如果确实需要(例如管理多个密钥对),可以使用: ```bash git config [--global] core.sshCommand "ssh -i /path/to/your/private/key" ``` ### ✅ 完成 完成以上步骤后,你在Linux系统上的Git就已经成功地配置了SSH密钥认证。现在你应该能够克隆SSH协议的仓库,以及向远程仓库推送或拉取代码,而无需每次都输入GitHub/GitLab等的账号密码。SSH协议也更加安全高效。 --- **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值