使用KeePassXC集成SSH Agent安全便利的管理SSH密钥

GitHub - keepassxreboot/keepassxc 是一款跨平台的开源密码管理器,数据会以加密格式存储在本地的 KDBX 格式的数据库文件中。

当然它的功能并不仅是简单存储账户和密码这么简单,除了自动填充之外的密码管理器基本功能,它还直接支持与 SSH Agent 集成,可以提供便利且安全的 SSH 管理体验。

什么是 SSH Agent?

SSH Agent 是一个用于辅助用户密钥使用与管理的工具。

为了安全起见,我们在通过例如 ssh-keygen -t ed25519 -C "Your comments" 生成密钥对的时候,最佳实践都会设置一个密码,提高密钥使用的安全性。

但是设置密钥密码之后,使用起来就变得十分的繁琐,每次都要输入密码。

SSH Agent 解决了这个问题,它会在后台运行。各类支持 SSH Agent 的 SSH 客户端,会在进行 SSH 相关操作时调用它来代理真正的 SSH 操作,正如它的名字 agent(代理)

只需要在 SSH会话 开始时,进行一次认证。后续会将解密后的私钥缓存至内存中,在此次会话中无需再输入密码解密。

为什么用密码管理器来存储 SSH 密钥?

既然 SSH Agent 本身就可以管理 SSH 密钥,为什么还要用 KeePassXC 来管理密钥呢?

使用密码管理器会因为更安全!这里不局限于 KeePassXC,推荐使用任意支持 SSH Agent 集成的密码管理器来管理你的 SSH 密钥,只是刚好我使用KeePassXC 而已。

如果不引入密码管理器,我们的密钥一般在生成后,默认会存在 ~/.ssh/ 目录下。

而这几年来,供应链投毒攻击以及其他黑客行为频发,防不胜防。特别是如今大语言模型盛行,相当对的人已经不愿意审查代码提交,项目的敏感数据也肆意交给 LLM,安全性更是直线下降,说不好哪个环节就发送问题了。

如果某天不幸惨遭毒手,~/.ssh/ 目录中的信息一般是黑客优先获取的。

如果有设置密钥密码可能倒还好,没设置就危险了。入侵者拿到你的私钥后,就可以随便进出你的服务器、提交代码等敏感操作(如果有配置的话)。

所以为了安全起见,一定要设置密钥的密码

而在引入密码管理器后,我们可以将密钥对以附件的形式存储在密码管理器中。需要的时候解锁加载,不需要的时候锁定卸载。

在做到按需使用的同时,还免去了密钥文件管理、输入密码等繁琐操作。

这里仅以 Windows 11 下的 KeePassXC 为例,进行 SSH 密钥的管理。并与SSH Agent 进行集成。

实现通过 KeePassXC 中的私钥进行 SSH 认证。

安装 OpenSSH

先打开 PowerShell 窗口,然后输入:

ssh -V

如果已经安装 OpenSSH,则会有版本号输出。

在已经安装 OpenSSH 的情况下,可以使用管理员打开 PowerShell ,并输入以下命令,查看 SSH Agent 是否运行:

Get-Service ssh-agent

如果显示 ssh-agent 为非 Running 状态,需要输入以下命令将其设置为自动启动并启动。

# 设置 ssh-agent 为自动启动
Get-Service ssh-agent | Set-Service -StartupType Automatic
# 启动 ssh-agent
Start-Service ssh-agent

如果未安装 OpenSSHWindows 11 可以在 设置 中的 系统-可选功能 中启用 OpenSSH客户端,然后再次输入上方的命令验证或启动。

有部分系统可能是因为家庭版或低版本等原因,并没有 可选功能 这个入口。

可以前往 PowerShell团队维护的 Github - Win32-OpenSSH ,根据架构下载对应安装包,一般的个人电脑下载 OpenSSH-Win64-v10.0.0.0.msi 就好。

也可以使用 scoop 等包管理器安装:

scoop install openssh

生成密钥对

如果你已经生成过密钥,可以跳过这个章节。

关于生成密钥,Github 的这个文档说明其实已经很详细了,可以参考。这里就简单的说一下。

密钥有不同的生成算法,如果没有什么需要访问上古系统(不支持一些算法)的需求,现在一般是推荐用 ed25519 算法 来生成。 其中 -C 参数是 Comment注释 的意思,你可以备注任意信息来区分不同用途的密钥,比如 Your@Email.comGithub_YourUserName

ssh-keygen -t ed25519 -C "your_email@example.com"

如果需要兼容旧系统,可以使用 rsa 算法:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

执行命令后,按照提示输入即可。

首先需要输入保存密钥的路径,默认是 用户目录/.ssh/ 下,生成一个名称为 id_ed25519 ( 不同算法名称不同)的文件。所以这里如果要自定义的话,输入的应该是 目录名/密钥名称 ) 。

比如我想在 D:\keys 目录下,生成 github_hafuhafu 的密钥对。就要输入 D:\keys\github_hafuhafu

回车确认后,提示输入密钥的密码。密码可以为空,但是为了安全,最好设置,哪怕是简单的密码。

再次回车确认后,需要重复输入一次密码。然后就会在目录下,生成两个文件 github_hafuhafugithub_hafuhafu.pub

其中有pub扩展名的文件 github_hafuhafu.pub公钥。内容是以 ssh- 开头。正如其名称,可以公开发放的密钥。一般是配置到其他系统或服务器上,让其信任你(信任这个公钥对应的私钥)。

而另一个文件 github_hafuhafu 就是私钥。内容中一般包含 -----BEGIN OPENSSH PRIVATE KEY----- 的字样。这个密钥是需要严格保管的,绝对不能给别人,也最好不要直接通过网络传输。

Windows 下的下载与配置

暂且仅以 Windows 11 系统为例,进行一系列的安装、配置、使用验证。

而在其他系统平台,除了安装程序步骤略有不同,设置和配置都是一样的。

安装与初始化

首先,到 Download – KeePassXC 中下载软件,一般情况下默认安装即可。如果安装后运行提示 缺少dll,则可以在下载页面找到 MSVC Redistributable 运行环境进行下载安装。

也可以选择到 KeePassXC的Github releases 下载安装包或便携版本。

打开软件后,创建一个新的数据库,名称随意。

其他设置无特殊需求,保持默认即可。

然后输入一个足够强力主密码。并且,如果你还希望用 KeePassXC 来存储日常的登录密码等信息,那么就不要和已有密码相同,并且只用你的大脑记住它。

不过KeePassXC对于弱密码的判断比较严苛...所以只要自己确定不重复、强度够、记得住就好。

私钥的保存

KeePassXC 里,每一项被叫做 条目,简单来说就是一个密码信息就是一个条目。

而来用给 条目 分组的东西就叫做 群组,默认是有一个 根群组

可以把不同用途的密码管理在不同群组下,比如 购物类游戏类开发类SSH 等...便于后续查找和管理。

所以我们可以在 根群组单击鼠标右键,然后创建一个名为 SSH 的群组,并换上合适的图标。

创建完群组后,单击左侧的群组名称。右侧的列表就会显示当前群组下有哪些条目。

我们在右侧空白处,单击鼠标右键 选择 新建条目,然后填写条目信息。

第一步,条目 标签下填写信息。标题和用户名可以随意输入,主要用于自己备忘,并不参与实际认证过程。比如这个密钥你只用来给 Github 用,那么标题就可以写 Gihub SSH Key ,用户名写你的 Github用户名 。URL 和标签同样不参与实际处理环节,根据需求填写即可。

密码则输入 创建密钥时的对应密码

第二步,点击 高级 标签,选择附件区域右侧的 添加文件-从磁盘加载,将生成的密钥对添加到附件列表中。

第三步,点击 SSH代理 标签,配置本条目的 SSH Agent 设置。

勾选 在打开或解锁数据库时,向代理添加密钥数据库关闭或锁定时,从代理中删除密钥

这使得 KeePassXC 可以根据密码库的解锁情况,动态向 SSH Agent 添加或移除密钥,提高安全性和认证的可控性。

Windows 系统不要勾选 使用此密钥时请求用户确认,不支持这个特性。勾选了不仅不会生效,还会影响正常使用。

私钥区域,选择附件,然后选择自己上传的私钥。

最后点击确定进行保存。

至此,SSH密钥 已经成功安全的保存在了 KeePassXC 中。

集成 SSH Agent

虽然 KeePassXC 无需插件就可以支持 SSH Agent,但是需要手动开启。

打开 工具-设置,找到并进入 SSH 代理 页面。

勾选 启用 SSH 代理集成,并选中 使用OpenSSH(推荐)。

Pageant 是知名 SSH 客户端 PuTTY 中的一个 Agent 工具。

OpenSSH 是标准的协议实现,已被各系统和服务所支持。无特殊需求无脑选择 OpenSSH 即可。

其他的值无特殊情况保持默认即可,然后点击确定保存。

保存后再重新打开 设置-SSH 代理 页面。可能出现两种情况:

  1. 提示 代理未在运行,无法列出身份
    SSH Agent 服务未安装或未启动。 参考上面的 安装 OpenSSH 进行配置。

  2. 提示 SSH 代理连接工作正常,说明 SSH Agent 已经成功运行,并且与 KeePassXC 成功集成。

验证

KeePassXC 锁定,并打开一个新的PowerShell 窗口,输入以下命令查看当前 SSH Agent 所加载的密钥列表:

ssh-add -l

正常情况下,应该是空的。会提示 The agent has no identities

然后解锁KeePassXC,重新执行ssh-add -l命令。

配置正确的情况下,将会显示当前加载的密钥指纹及备注。

日常使用

到这个步骤时,密钥的创建,KeePassXC 和 SSH Agent 的集成均已完毕。

此时有人会疑惑:“那如果我不同平台需要使用不同的 SSH Key 呢?”

这当然是很常见且合理的需求,推荐的做法也是密钥专一单独的使用。

GitHub 单独使用一个SSH Key,然后服务器也单独使用一个或多个SSH Key

在不使用 KeePassXC 管理时,一般是把密钥对放在.ssh目录下。

然后执行ssh相关命令时,会去遍历目录下的相关密钥,尝试认证。

如果只有一两个密钥,可能没啥影响。

但是如果有很多密钥就不能这样了,一个是会影响认证效率,另一个是可能会被 SSH 服务的MaxAuthTries拒绝,或者触发fail2ban

此时,我们可以利用 SSH 的 config文件来实现精准匹配密钥。

用户目录/.ssh/目录下,创建一个config文件,用于指定不同Host所用的认证密钥。

对于每一个需要进行密钥认证的信息,添加如下格式的文本:

Host 自定义的别名 (比如 github)
    HostName 实际的IP或域名 (比如 github.com)
    User 用户名 (如果是git类的服务一般填git就好,如果是服务器则填写配置了公钥的用户名)
    IdentitiesOnly yes (一般填yes,非yes情况下,会轮询多个密钥,可能导致一些平台的频率限制)
    IdentityFile ~/.ssh/对应的密钥

其中,IdentityFile一般情况下填写的应该是私钥文件的路径。

不过因为我们使用的KeePassXC 来保存密钥,因此我们的本机上是不会直接存储私钥的。

此时,我们可以将私钥对应的公钥保存到本机的目录中(比如~/.ssh/下)。此时IdentityFile就可以填写公钥文件的路径。它会根据密钥的指纹,获取SSH Agent中对应的私钥。

实际使用:

# Github 专用
Host github.com
    HostName github.com
    User git
    IdentitiesOnly yes
    IdentityFile ~/.ssh/id_ed25519_github.pub

# Gitee 专用
Host gitee.com
    HostName gitee.com
    User git
    IdentitiesOnly yes
    IdentityFile ~/.ssh/id_ed25519_gitee.pub

# 比如腾讯云的某台服务器
Host Tencent1
    HostName Your Server IP
    User ubuntu
    IdentitiesOnly yes
    IdentityFile ~/.ssh/id_ed25519_tencent.pub

# 可能有多台服务器配置同一个公钥认证,支持通配符 * 
Host *
    IdentitiesOnly yes
    IdentityFile ~/.ssh/id_ed25519_common.pub

Git 无法公钥认证

因为我们使用了 KeePassXC 来存储私钥,因此我们 ssh 目录和配置文件IdentityFile中指向的全是私钥对应的公钥。

而正常情况下,IdentityFile应该指向私钥的。

由于我们使用了ssh-agent,因此在指向公钥后,会去自动查找已加载的配对私钥。

但是 Windows 上的 Git 在默认安装时如果没有选择 OpenSSH 的话,其默认内置客户端很有可能不认这个操作。你会发现通过ssh -T git@github.com可以认证成功,但是进行git push等操作都会失败,提示:

Load key "/YourPath/.ssh/your_key.pub": error in libcrypto

git@gitee.com: Permission denied (publickey).

fatal: Could not read from remote repository.

Please make sure you have the correct access rights

and the repository exists.

此问题在官方的 FAQ 中亦有记载:如何在 Windows 上使用 KeePassXC SSH 代理与 Git (Bash) 一起工作?
我们可以通过以下命令强制 Git 使用 系统安装的OpenSSH,这样就能正确走 SSH Agent 和 KeePassXC 的集成:

# 改为你实际的 OpenSSH 程序路径
git config --global core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe"

KeePassXC 的官方文档与 FAQ

Documentation and FAQ – KeePassXC

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇