配置不同私钥
shh秘钥是如何工作的
问题:
回答:
SSH(Secure Shell)密钥是用于安全连接到远程服务器的加密密钥对。这个密钥对由一个私钥和一个公钥组成。下面是SSH密钥是如何工作的基本原理:
-
生成密钥对: 用户首先在本地计算机上生成SSH密钥对。这包括一个私钥(通常存储在用户计算机上)和一个公钥(通常上传到远程服务器)。
-
私钥和公钥之间的关系: 这两个密钥是数学上相关的,但是从一个密钥无法直接计算出另一个密钥。任何拥有私钥的人都可以签署或解密由公钥加密的信息,反之亦然。
-
认证过程: 当用户尝试通过SSH连接到远程服务器时,服务器会向客户端发送一个随机的挑战。客户端使用其私钥对挑战进行签名,并将签名发送回服务器。服务器使用之前存储的该用户的公钥验证签名的有效性。如果签名有效,用户就被授权登录。
-
加密通信: 一旦认证成功,SSH会继续使用密钥对来加密通信,确保数据在传输过程中的安全性。
这种基于密钥对的认证方法比传统的基于密码的认证更安全,因为私钥通常是存储在用户本地计算机上的,而不是在远程服务器上。这意味着即使远程服务器的密码数据库被泄露,攻击者也无法获得用户的私钥,因为私钥通常是加密的并且存储在本地。
git不同的秘钥是如何被管理的
问题:
回答:
在使用 Git 时,可能会有多个 SSH 密钥,例如一个用于 GitHub、另一个用于公司内部 Git 仓库。为了管理多个密钥,你可以使用 SSH 配置文件(~/.ssh/config)。以下是一些关键的步骤:
- 生成不同的 SSH 密钥: 首先,确保你为每个需要的身份生成了不同的 SSH 密钥对。你可以使用 ssh-keygen命令 命令来生成新的密钥。在生成密钥时,可以指定不同的文件名,例如:
ssh-keygen -t rsa -b 指定密钥长度 -C "邮箱" -f 文件名
例如:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f ~/.ssh/id_rsa_github
当你执行 ssh-keygen 命令时,
提示你输入这个短语(passphrase):为你的 SSH 私钥加上一个额外的保护层。这个短语是一个密码,它不同于你的系统登录密码,而是专门用于保护你的私钥。
如果你设置了这个短语,每次你使用私钥进行 SSH 操作时,系统都会要求你输入这个短语以验证身份。这提供了额外的安全性,因为即使私钥被盗,攻击者也需要知道短语才能使用它。
你有两个选项:
1.输入短语: 如果你想要设置短语,输入你选择的密码并按回车。请确保你记住了这个密码,因为以后每次使用私钥时都需要输入。
2. 不设置短语:如果你不想设置短语,直接按回车键。这样私钥就不会有短语保护,但请注意,这样可能会降低私钥的安全性。
选择是否设置短语取决于你对安全性和方便性的权衡。如果你的私钥用于非常敏感的操作,强烈建议设置短语。
如果出现Saving key "~/.ssh/id_rsa_github" failed: No such file or directory
则把命令中的-f ~/.ssh/id_rsa_github 参数删除,手动指定
Enter file in which to save the key
(C:\Users\用户名/.ssh/id_rsa): id_rsa_github
提示你为私钥起一个名字,此处我给的是id_rsa_github
- 配置 SSH 文件: 编辑或创建
~/.ssh/config文件。如果文件不存在,可以用文本编辑器创建。在文件中,你可以添加类似以下的配置:
# GitHub 密钥
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_github
# 默认密钥
Host *
AddKeysToAgent yes
# UseKeychain yes #这个选项通常用于 macOS 系统上,win上不识别
IdentityFile ~/.ssh/id_rsa
# gitee and github
# 注意:多个Host公用一个公钥时,
# 对应的HostName和Port必须跟在Host后面
Host gitee.com
HostName gitee.com
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
# gerrit
Host gerrit.awaimai.com
HostName gerrit.awaimai.com
Port 8000
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_gerrit
# home_gitlab
Host 119.34.4.123
HostName 119.34.4.123
Port 9200
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_home_gitlab
#注意,这里多个Host公用一个公钥,如果像原文作者说的那样,两组Host&HostName&Port依次写,会不能正确识别第一组,ssh -T git@第一组Host,会报Permission denied (publickey),不懂。先分开写,分开写是可以的。
Host 192.168.2.164
HostName 192.168.2.164
Port 30001
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_home_gitlab
# 其他的统一用id_rsa文件登陆,或者密码。
# 注意:这里的第二行后面有个password,就是同时允许密码登陆
# 不然第一次没加公钥,密码也登陆不了,会提示错误:Permission denied (publickey,password).
Host *
PreferredAuthentications publickey,password
IdentityFile ~/.ssh/id_rsa
这个例子中,Host * 部分是默认配置,指定了默认使用 id_rsa 作为密钥。而 Host github.com 指定了对 GitHub 使用 id_rsa_github 密钥。你可以根据需要添加其他主机的配置。
- 添加 SSH 密钥到 SSH 代理:
在此之前先把公钥添加到远程仓库服务中
在每次启动计算机时,你可能需要手动添加 SSH 密钥到 SSH 代理。运行以下命令:
- 开启ssh-agent服务。
ssh-agent -s - 添加密钥(注意在
.ssh目录中执行)
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_github
这会将密钥添加到 SSH 代理中,以便 Git 可以自动使用它们。
- 检查是否添加成功
ssh -vT git@github.com
或者查看添加的shh服务
ssh-add -l
现在,当你使用 Git 进行操作时,它将根据你配置的主机选择正确的密钥。这有助于管理多个 Git 身份并确保使用正确的密钥与正确的仓库进行通信。
问题
如果在配置过程中出现
Could not open a connection to your authentication agent.
通常常是由于 SSH Agent 未启动或者你的 shell 环境无法连接到 SSH Agent 导致的
- 检查当前是否在
.ssh目录中
- 在终端中输入
eval "$(ssh-agent -s)"启动服务 如果出现unable to start ssh-agent service, error :1058说明服务可能被禁用了 您可以通过在 Windows PowerShell中运行来检查这一点:
Get-Service ssh-agent
然后检查status的输出不是running。
Status Name DisplayName
------ ---- -----------
Stopped ssh-agent OpenSSH Authentication Agent
然后通过运行检查该服务是否已被禁用
Get-Service ssh-agent | Select StartType
StartType
---------
Disabled
我建议将服务设置为手动启动。这意味着只要您运行 ssh-agent,它就会启动该服务。您可以通过服务 GUI 执行此操作,也可以在管理模式下运行命令:
> Get-Service -Name ssh-agent | Set-Service -StartupType Manual
或者,如果您愿意,也可以通过 GUI 进行设置
- 将ssh设置为自启动
确保 SSH Agent 在登录时自动启动。你可以将以下行添加到你的 shell 配置文件(例如 ~/.bashrc 或 ~/.zshrc):
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval "$(ssh-agent -s)"
ssh-add
fi
这将检查 SSH Agent 是否已经在运行,如果没有,就启动它并添加 SSH 密钥。
Citation:
References: