5 个版本
0.1.3 | 2024 年 6 月 30 日 |
---|---|
0.1.2 | 2024 年 6 月 18 日 |
0.1.0 | 2024 年 5 月 6 日 |
0.0.2 | 2024 年 4 月 30 日 |
0.0.1 | 2024 年 4 月 29 日 |
#451 在 密码学 中
每月 383 次下载
210KB
695 行
Git 签名和验证的 OpenPGP 工具
此项目提供了 oct-git
"Git OpenPGP 卡工具"。
oct-git
在 Git 分布式版本控制系统环境中生成(并验证)OpenPGP 签名。它作为 gpg
程序的替代品,用于 Git。
原因
oct-git
工具是一个独立、无任何部件移动的解决方案,用纯 Rust 编写,基于 rPGP OpenPGP 库和 Rust Crypto。它追求简单性,不需要长时间运行的过程[^pcsc],并且不会保持与 OpenPGP 卡硬件设备的永久连接。
[^pcsc]: 在 Linux 上,需要 pcscd
系统服务,而在 Windows 和 Mac 上,PC/SC 子系统不需要安装(它是核心系统的一部分,默认可用)。
oct-git
在 Linux、Mac 和 Windows 上本机运行。它是一个新的独立解决方案,不需要(或使用)GnuPG 的任何部分。
相比之下,其他处理 OpenPGP 的工具通常很复杂,有很多移动部件(包括多个进程,其中一些是长时间运行的)。
设置
oct-git
专门设计为与 Git 版本控制系统一起使用,作为执行 OpenPGP 签名和验证的辅助工具。用户通常在初始一次性设置后不会直接与 oct-git
交互。
如果您不带参数调用 oct-git
,您将看到非常简短的设置帮助文本。
配置 Git 以使用 oct-git
为了使用 oct-git
,Git 必须进行适当的配置。
最重要的是,必须配置 git
调用的用于 OpenPGP 功能的二进制文件
git config --global gpg.program <path to oct-git>
此外,必须配置 git
应用于签名的 OpenPGP 密钥。此值可以设置为签名组件密钥的 OpenPGP 指纹,或密钥的主要指纹
git config --global user.signingkey <fingerprint>
一旦完成此基本设置,就可以指示 git
默认对每个提交进行签名
git config --global commit.gpgsign true
默认情况下对每个Git标签进行签名
git config --global tag.gpgsign true
在oct-git和GnuPG之间切换Git的OpenPGP子系统
如果您想尝试 oct-git
,但在使用它或GnuPG之间犹豫不决,一旦您设置了Git的OpenPGP配置,您就可以轻松地在OpenPGP Git子系统之间切换
您只需调用
git config --global gpg.program <path to GnuPG>
或
git config --global gpg.program <path to oct-git>
在两个替代的OpenPGP子系统之间切换应该是快速且大部分无趣的体验。如果您想比较它们或只是玩玩,我们鼓励您毫不犹豫地切换实现
架构和子系统
oct-git
工具由一个独立的二进制文件组成,该文件被git
调用,用于创建签名和验证签名。
从逻辑上讲,oct-git
由一系列子系统组成
graph TB
Git --> OG["oct-git <br/> (commit/tag signing and verification)"]
OG --> CARD["OpenPGP card <br/> (produces signatures, accessed via PC/SC)"]
OG --> STATE["openpgp-card-state library <br/> (config and PIN storage backend access)"]
STATE --> PINS["PIN storage backend <br/> (makes User PINs available to applications)"]
OG --> NOTIFY["Desktop notifications <br/> (e.g.: touch confirmation required)"]
OG --> RCS["rpgpie-certificate-store"]
RCS --> CERTD["openpgp-cert-d <br/> (shared public key storage)"]
RCS --> PKI["OpenPGP PKI <br/> (retrieve certificates from keyservers etc)"]
这些子系统中的大部分都由链接到oct-git
程序中的Rust库组成。
以下子系统不是库
- "OpenPGP卡"是一种物理硬件安全设备(通常是USB设备),其中包含您的私钥材料,用于发出Git签名。
- "openpgp-cert-d"实例由您本地文件系统中共享位置的文件集组成,其中包含OpenPGP证书(公钥)。
- "OpenPGP PKI"表示提供OpenPGP证书(公钥)的公钥服务器。此子系统通过互联网查询公钥服务器以获取证书副本。
用户PIN:配置对OpenPGP卡设备的访问
OpenPGP卡设备需要用户PIN来授权私钥操作(在这种情况下,该工具用于为git提交创建加密签名)。
对OpenPGP卡用户PIN的访问通过共享的openpgp-card-state基础设施间接处理。
如果您已经在openpgp-card-state中存储了卡的User PIN,则可以从oct-git
立即使用它。否则,您可以使用以下方式使用oct-git
存储User PIN
$ oct-git --store-card-pin
Found OpenPGP card 0000:01234567
No User PIN is stored in openpgp-card-state
Enter User PIN to store (or <Enter> to skip):
User PIN has been stored in openpgp-card-state
oct-git
中的用户PIN存储过程是交互式的。对于每个连接的OpenPGP卡设备,它检查openpgp-card-state
中是否已经存在有效的PIN。如果没有,则提示用户输入该卡的User PIN。
签名
oct-git
可以用作Git来签名提交或标签。
使用oct-git
签名需要将带有数据签名密钥材料的OpenPGP卡插入到您的系统。此外,任何OpenPGP卡设备的用户PIN都必须可以通过openpgp-card-state(见上文)访问。
验证
签名验证自动使用来自本地openpgp-cert-d "共享OpenPGP证书目录"的OpenPGP证书。
如果证书不在本地openpgp-cert-d存储中,oct-git
将尝试自动从多个知名公共在线目录中自动下载它 [^lookup](目前,oct-git
查询keyserver.ubuntu.com和keys.openpgp.org)。
[^lookup]:获取证书的PKI查询通过签名密钥指纹或密钥ID进行查找。
手动导入证书到存储库
您可以使用oct-git
手动将证书导入到"共享OpenPGP证书目录"。
$ oct-git --import <certificate file>
如果您想通过oct-git
无法从公共OpenPGP PKI获得的证书来验证提交,这可能很有用。
限制:更新存储库中的证书
oct-git
目前无法更新openpgp-cert-d存储中的证书。有关此功能的跟踪问题。
限制:验证“信任级别”
oct-git
当前不支持显示签名验证的“信任级别”。所涉及的“信任”概念基于 Web of Trust,需要配置“信任根”,以及执行“Web of Trust”评估的签名链。
该功能 将在未来添加。
在此之前,oct-git
显示签名时使用“未验证”的信任级别,因为我们目前没有发出更具体信息的依据。
此输出表示签名在密码学上是正确的,并显示了发行者的指纹。然而,没有已知的信任链可追溯到签名者。
内部结构
技术上,oct-git
实现了 GnuPG 的 CLI 界面一个非常小的子集的类似物。
具体来说,我们实现了足够的功能,以便 Git 能够使用 oct-git
而不是 gpg
来执行签名和验证操作。
拥有一个用于 Git 的单独二进制文件使 oct-git
能够在用户交互中更加具体。例如,当需要触摸确认时,oct-git
将显示一个通知,告知用户需要在卡片上输入触摸,并显示请求来自 oct-git
。
以下两个部分显示了如何内部调用 oct-git
—— 通常此类调用由 git
程序发出。
基本分离签名
oct-git -u SIGNING_KEY_FPR --detach-sign < Cargo.toml > Cargo.toml.sig
SIGNING_KEY_FPR
参数必须设置为 签名 子密钥的指纹(不是证书),格式为十六进制编码,且 无 空格(可选的 0x
前缀在比较时被移除)。
可以使用 oct status
命令检索指纹。
签名验证
oct-git --verify Cargo.toml.sig - < Cargo.toml
未来方向
Git 与 OpenPGP 签名和验证子系统的结合目前基于 GnuPG 的 CLI 界面。
这并不是最佳方案,并且限制了 Git 的替代 OpenPGP 子系统(如 oct-git
)的设计空间。从长远来看,如果 Git 支持一种更简单、通用且定义良好的接口来连接自身和签名/验证子系统,那将是极好的。
此目标目前超出了此项目的范围,但如果您正在从事相关工作,我们非常愿意听取您的意见!
资助
此项目部分由 NGI Assure 资助,该基金由 NLnet 建立,并由欧盟委员会的 Next Generation Internet 计划提供资金支持。
🐒️🥯️
依赖关系
~49–86MB
~1.5M SLoC