#openpgp-card #git-tool #signing #verification #signature-verification #user #pin

bin+lib openpgp-card-tool-git

一个专注于 OpenPGP 卡的 Git 签名和验证的简单工具

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密码学

Download history 239/week @ 2024-04-25 171/week @ 2024-05-02 12/week @ 2024-05-09 9/week @ 2024-05-16 6/week @ 2024-05-23 118/week @ 2024-06-13 29/week @ 2024-06-20 161/week @ 2024-06-27 17/week @ 2024-07-04

每月 383 次下载

MIT/Apache

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.comkeys.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 计划提供资金支持。

NGI Assure Logo


🐒️🥯️

依赖关系

~49–86MB
~1.5M SLoC