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命令行工具 中排名

Download history 181/week @ 2024-04-29 5/week @ 2024-05-20 254/week @ 2024-05-27 235/week @ 2024-06-03 14/week @ 2024-06-10 295/week @ 2024-06-17 112/week @ 2024-06-24 137/week @ 2024-07-01 3/week @ 2024-07-29 129/week @ 2024-08-12

132 每月下载量

CC0 许可证

68KB
1K SLoC

rsop

rsop 是一个 "无状态 OpenPGP" 命令行工具。它提供了一个简单、标准化的 CLI 接口来执行一组常见的 OpenPGP 操作。

rsop 本地支持使用 OpenPGP 卡设备进行操作。它基于 rpgprpgpie 🦀️🔐🥧(以及 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