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 加密学
1,283 每月下载量
39KB
450 行
简单的独立SSH Agent用于OpenPGP卡
这是一个使用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