11 个版本
0.3.7 | 2024 年 8 月 12 日 |
---|---|
0.3.6 | 2024 年 6 月 30 日 |
0.3.1 | 2024 年 4 月 29 日 |
0.2.1 | 2024 年 3 月 28 日 |
0.1.0 | 2024 年 2 月 26 日 |
235 在 命令行工具 中排名
132 每月下载量
68KB
1K SLoC
rsop
rsop
是一个 "无状态 OpenPGP" 命令行工具。它提供了一个简单、标准化的 CLI 接口来执行一组常见的 OpenPGP 操作。
rsop 本地支持使用 OpenPGP 卡设备进行操作。它基于 rpgp 和 rpgpie 🦀️🔐🥧(以及 rpgpie-sop 适配器库)。
无状态 OpenPGP 命令行界面
无状态 OpenPGP 命令行界面(SOP)是处理 OpenPGP 消息和密钥材料的不依赖于具体实现的标准化规范。
无状态 OpenPGP 工具(如 rsop
)非常适合用于脚本使用场景。
有关 SOP 的更多背景信息和详细信息,请参阅 https://datatracker.ietf.org/doc/draft-dkg-openpgp-stateless-cli/。
rsop 运行示例
rsop
可以使用 cargo 从 Rust 源代码构建和安装
$ cargo install rsop
[..]
或者,您可以在系统包中查找 rsop。它在 Arch Linux 中可用。
安装后,您可以使用 rsop
二进制文件,例如使用它生成一个新的密钥并用它签署消息
$ rsop generate-key "<[email protected]>" > alice.pgp
$ echo "hello world" | rsop inline-sign alice.pgp
-----BEGIN PGP MESSAGE-----
xA0DAAoWRkwnBKe7uWYByxJiAGXLjm9oZWxsbyB3b3JsZArCdQQAFgoAHRYhBGdn
Wt8kdsJqcSYzsUZMJwSnu7lmBQJly45vAAoJEEZMJwSnu7lmrxYBAIlPPn7R2ScC
Qo9s06ebeI/zilJ9vNB7hi4t3Yw6oxbIAP0ddnO5tP2SJRDx+5eWd0slp3G6+AEz
FhrH5HCHKSvQAg==
=bnER
-----END PGP MESSAGE-----
从检出源运行
或者,您可以直接从这个仓库运行 rsop
$ cargo run -- generate-key "<[email protected]>"
[..]
OpenPGP 卡支持
rsop
本地支持在 OpenPGP 卡 设备上使用密钥材料。
用户 PIN
OpenPGP 卡设备需要 用户 PIN 才能执行加密操作。 rsop
使用 openpgp-card-state 库来处理用户 PIN。
这意味着用户 PIN 必须通过 openpgp-card-state 支持的后端之一提供给 rsop
。
示例测试运行
为了演示如何使用 rsop
与 OpenPGP 卡,我们将在这里进行演示运行。为此演示,我们将从一个可以覆盖的备用卡开始。
除了rsop
之外,这个示例运行还使用了来自openpgp-card-tools存储库的oct
工具来配置我们的OpenPGP卡。
生成测试密钥
首先,我们为测试用户Alice生成一个新的私钥。我们使用文件扩展名.tsk
来表示该文件包含一个可传输的密钥。
$ rsop generate-key "<[email protected]>" > alice.tsk
然后,我们从TSK文件中提取证书表示。也就是说,我们为Alice生成一个等效的“公钥”,其中省略了私钥材料。我们使用文件扩展名.cert
来存储证书
$ rsop extract-cert < alice.tsk > alice.cert
为测试设置我们的OpenPGP卡
现在,我们插入我们的测试OpenPGP卡并检查其身份
$ oct list
Available OpenPGP cards:
FFFE:57011137
我们在这个示例中使用卡的标识为FFFE:57011137
(这张卡上没有我们关心的密钥,所以我们很高兴使用它。以下步骤将完全覆盖卡的内存!)
因此,首先我们将卡恢复出厂设置,从一张白纸开始。此命令将从卡中删除任何密钥材料,并将用户和管理PIN重置为其默认值
$ oct system factory-reset --card FFFE:57011137
Resetting Card FFFE:57011137
现在我们将Alice的密钥材料导入到我们的测试卡上
$ oct admin --card FFFE:57011137 import alice.tsk
Enter Admin PIN:
大多数OpenPGP卡设备的默认管理员PIN是12345678
。我们在上面的提示中输入了此PIN。
现在我们可以查看卡上刚导入的密钥材料了
$ oct status
OpenPGP card FFFE:57011137 (card version 2.0)
Signature key:
Fingerprint: 26FD 6C05 D8AB 6D9A 7A27 A5CA DB2E 1E31 FB8E 9EA7
Creation Time: 2024-04-08 16:26:54 UTC
Algorithm: Ed25519 (EdDSA)
Signatures made: 0
Decryption key:
Fingerprint: 4B8D 7AE1 D4DE 65CE F0A8 4D2E A60A B338 5999 2476
Creation Time: 2024-04-08 16:26:54 UTC
Algorithm: Cv25519 (ECDH)
Authentication key:
Fingerprint: [unset]
Algorithm: RSA 2048 [e 32]
Remaining PIN attempts: User: 3, Admin: 3, Reset Code: 3
在主机上配置这张卡的User PIN
现在我们需要以openpgp-card-state可以访问的方式将我们的测试卡的User PIN存储在一种机制中。对于这个测试,我们只是将User PIN存储在一个纯文本配置文件中。存储User PIN最简单的方法是将以下内容添加到openpgp-card-state
配置文件中(如果你在玩这个游戏,需要调整ident
的值以反映你自己的卡的标识)
[[cards]]
ident = "FFFE:57011137"
[cards.pin_storage]
Direct = "123456"
请注意,在上述factory-reset之后,卡的User PIN通常是123456
。对于这次测试运行,我们不更改User PIN(这显然不是生产卡的良策),只是将此User PIN值存储在openpgp-card-state配置文件中(使用“Direct”PIN存储后端,这意味着PIN直接存储在配置文件中,为纯文本)。
在Linux系统中,openpgp-card-state配置文件通常位于~/.config/openpgp-card-state/config.toml
。它可以由任何编辑器更改。
在生产中使用OpenPGP卡,并在其上存储有价值的密钥材料时,你可能希望考虑使用不同的PIN存储后端。有关详细信息,请参阅openpgp-card-state的文档。
卡上的解密
我们现在已经完成了卡的配置。在这个示例中,我们将使用卡上的密钥材料来解密加密到Alice证书的消息。
所以首先,我们加密一条消息给Alice。为此,我们使用Alice的证书中的公钥材料,来自Alice的证书alice.cert
$ echo "hello alice" | rsop encrypt alice.cert > alice.msg
现在,我们可以根据Alice的公钥材料来解密消息。请注意,我们正在将证书文件alice.cert
提供给rsop
$ cat alice.msg | rsop decrypt alice.cert
hello alice
请注意,如果不使用OpenPGP卡,这将无法工作!基于软件密钥的操作解密需要从alice.tsk
中获取私钥材料。
当使用rsop
在OpenPGP卡上执行私钥操作(即:解密或签名)时,后台会进行一些操作
- 系统上插的所有OpenPGP卡都会被枚举。
- rsop检查是否有任何卡片包含与
alice.cert
中的子密钥匹配的私钥材料,该子密钥与操作相关。 - 找到合适的密钥材料后,rsop使用该卡片的标识符通过
openpgp-card-state
配置查找卡片的用户PIN(注意,PIN可以存储在不同的后端中,这些后端使用不同的存储机制并提供了不同的安全保证)。 - 如果用户PIN通过
openpgp-card-state
存储,rsop将获取它。 - 将用户PIN展示给卡片进行验证。这授权了请求的加密操作。
- 在卡片上执行加密操作。
卡片上的签名
类似地,可以使用rsop
通过OpenPGP卡生成加密签名
$ echo "hello world" | rsop inline-sign alice.cert > sig.alice
注意,与上面一样,alice.cert
中的公钥数据本身不足以发出签名。与解密类似,rsop
搜索包含与alice.cert
中的签名子密钥相对应的私钥材料的OpenPGP卡设备,并要求卡片使用该密钥发出签名。
一旦生成,任何人都可以通过将其与其证书中的Alice的公钥材料进行验证来验证此签名,该证书为alice.cert
$ cat sig.alice | rsop inline-verify alice.cert
hello world
OpenPGP互操作性测试套件
rsop
包含在OpenPGP互操作性测试套件中,该套件测试实现的功能、遵循预期的情况,以及大量实现之间的互操作性。
Rust SOP接口
rsop
CLI工具是使用出色的https://crates.io/crates/sop框架构建的。从rpgpie-sop可以简单地派生出rsop
二进制。
构建块概述
flowchart TD
RSOP["rsop <br/> (SOP CLI tool)"] --> RPIESOP
RPIESOP["rpgpie-sop <br/> (SOP interface wrapper for rpgpie)"] --> RPIE
RPIE["rpgpie <br/> (Experimental high level OpenPGP API)"] --> RPGP
RPGP["rPGP <br/> (OpenPGP implementation)"]
RPIE --> OCR["openpgp-card-rpgp"] --> RPGP
RPIE --> OCS["openpgp-card-state <br/> (OpenPGP card User PIN handling)"]
OCR --> OC["openpgp-card"]
许可证
rsop
的(简单)代码是CC0许可。
然而,请注意,从它构建二进制包时,二进制的许可证当然是由其依赖项的许可证决定的。
警告,早期项目!
rsop和rpgpie目前处于实验性、早期开发阶段,并且尚未打算用于生产使用。
依赖项
~19–33MB
~440K SLoC