#openpgp-card #ssh-agent #ssh-key #authentication #pin #user #nist

app openpgp-card-ssh-agent

基于OpenPGP卡认证密钥的简单ssh-agent

16个发布版本

0.3.2 2024年4月23日
0.3.1 2024年3月26日
0.2.4 2024年3月24日
0.2.0 2024年2月28日
0.1.4 2022年8月27日

#106 in 加密学

Download history 120/week @ 2024-04-18 34/week @ 2024-04-25 5/week @ 2024-05-02 4/week @ 2024-05-16 3/week @ 2024-05-23

1,283 每月下载量

MIT/Apache

39KB
450

简单的独立SSH Agent用于OpenPGP卡

crates-io-badge status-badge

这是一个使用OpenPGP卡上密钥的简单SSH代理。卡通过PC/SC(例如通过 pcscd)访问。

该代理目前支持RSA 2048/4096,NIST P-256/384/521和Curve 25519密钥。

该代理依赖于 openpgp-card-state 来处理OpenPGP卡的用户PIN。

开发状态

这个ssh-agent可以工作,你现在就可以使用它。

然而,它处于早期开发阶段。在开发过程中,我们可能会暂时破坏某些功能。

安装

您可以通过运行以下命令从crates.io安装最新版本的openpgp-card-ssh-agent

$ cargo install openpgp-card-ssh-agent

或者从这个仓库中,通过检出代码并运行

$ cargo install --path .

持久化您的OpenPGP卡的用户PIN

这个ssh-agent使用 OpenPGP卡 硬件执行私钥加密操作。这些卡需要用户PIN进行授权。

该ssh-agent假定您的卡的用户PIN已持久化在您的宿主机计算机上,并且PIN可以通过ssh-agent获取。理想情况下,无需任何用户交互。

OpenPGP卡用户PIN存储在平台特定的机密存储机制中。这些存储是长期持久的,因此通常在每个机器上持久化一个用户PIN就足够了。

有关更多详细信息,请参阅 openpgp-card-state

列出OpenPGP卡

要查看连接到您的机器并可以与ssh代理一起使用的OpenPGP卡,您可以使用 ssh-add 命令从ssh代理获取列表,如下所示

$ ssh-add -L
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFKjA9vr4sa4WznatwBo05LrmZ2jogj3fyrQ5hNLYsFT 0000:01234567

输出显示了您的卡认证密钥槽中的公钥材料(以OpenSSH格式显示),以及卡的标识符(这里: 0000:01234567)。您可以使用该标识符来存储用户PIN,如下一节所述(使用 ssh-add -s 0000:01234567)。

请注意,此列表不会指示是否已为卡片存储了PIN。

使用ssh-add存储用户PIN

要将卡的User PIN存储在您的系统上,您可以使用ssh-add命令并提供卡的"ident"(例如:0000:01234567

$ ssh-add -s 0000:01234567
Enter passphrase for PKCS#11:

信息提示应输入"PKCS#11的密码短语"。当使用此ssh-agent时,这不适用且令人困惑。然而,此字符串在ssh中是硬编码的,可以安全地忽略此消息的措辞。

在此提示下,您可以输入用户PIN(许多OpenPGP卡默认的用户PIN为123456)。如果卡接受它作为有效PIN,则PIN将被测试并持久化。

运行ssh代理

$ openpgp-card-ssh-agent -H unix://$XDG_RUNTIME_DIR/ocsa.sock

要调试代理的操作,您可以查看调试输出,例如通过以下方式运行

$ RUST_LOG=debug openpgp-card-ssh-agent -H unix://$XDG_RUNTIME_DIR/ocsa.sock

在Windows上,使用以下格式使用命名管道

$ openpgp-card-ssh-agent -H \\.\pipe\ocsa

使用

要使用此ssh-agent,您需要设置SSH_AUTH_SOCK环境变量

$ export SSH_AUTH_SOCK=$XDG_RUNTIME_DIR/ocsa.sock

或者在Windows上,将该变量设置为命名管道

set SSH_AUTH_SOCK=\\.\pipe\ocsa

之后,常规ssh使用将正常工作,并自动使用任何可用的OpenPGP卡进行身份验证

$ ssh <hostname>

除了OpenPGP卡用户PIN之外,此代理不需要任何配置或状态。任何卡都可以插入并使用,如果ssh请求其认证密钥槽中的公钥材料进行签名,则将自动使用。

在此ssh-agent启动后插入的卡将在下一次操作期间自动找到。

故障排除

访问OpenPGP卡设备的错误

默认情况下,GnuPG可能会锁定卡。这可能会阻止其他软件,如此ssh-agent访问卡。终止scdaemon进程(该进程处理GnuPG的智能卡访问)是调试卡访问问题的一种简单方法。

Git for Windows

在Windows上,通过SSH访问Git可能无法与此ssh代理一起工作。如果出现这种情况,原因通常是Windows上的Git附带了一个捆绑的OpenSSH客户端,该客户端不支持命名管道。

要解决这个问题,您应该在安装Git for Windows时选择“使用Windows原生OpenSSH实现”的适当选项选择适当的选项

触摸确认通知

此SSH代理使用notify-rust crate来提醒用户,如果卡需要触摸确认。

要构建不带通知机制(不推荐),您可以使用--no-default-features参数。

致谢

此项目在很大程度上基于Wiktor Kwapisiewicz的工作。大部分重的ssh工作都发生在ssh-agent-lib中。

依赖关系

~8–36MB
~544K SLoC