#key #openpgp #piv #slot #devices #context #cli-tool

app openpgp-piv-tools

一个用于在 OpenPGP 环境中使用 PIV 设备的命令行工具

2 个版本

0.0.2 2023 年 6 月 24 日
0.0.1 2023 年 6 月 15 日

#5 in #piv

LGPL-2.0-or-later

65KB
859

openpgp-piv-tools

crates.io openpgp-piv-tools status-badge Mastodon Matrix: #openpgp-card:matrix.org

此包实现了 opgpiv,一个探索性的命令行工具,它公开了在 openpgp-piv-sequoia 中的功能,以在 OpenPGP 环境中使用 PIV 设备。

将 OpenPGP 组件密钥上传到 YubiKey PIV 应用程序

可以通过 PIV 接口将密钥材料导入到卡片中。

默认情况下,upload 命令会自动从 OpenPGP 密钥中选择适当的子密钥(假设请求的功能只有一个子密钥),并将其上传到 PIV 应用程序中的适当密钥槽

  • 身份验证子密钥:PIV 身份验证密钥 9A
  • 签名子密钥:PIV 数字签名密钥 9C
  • 加密子密钥:PIV 密钥管理密钥 9D
$ cargo run -- upload --serial 16019180 --slot dec --key /tmp/janus.key

目前支持的插槽标识符:sig, dec, aut, ret01, ret02, ret03, ret04, ret05(已退役密钥的插槽 ["retXX"] 可以用于解密密钥)。

或者,可以显式指定组件密钥的 --fingerprint,例如

$ cargo run -- upload --serial 16019180 --slot dec --key /tmp/janus.key --fingerprint 6771DFE6E3E7C57E36E67A8CBC64A0240E63DA8A

在上传 sig 子密钥之后

$ cargo run -- upload --serial 16019180 --slot sig --key /tmp/janus.key

让我们检查 PIV 应用程序的状态

$ cargo run -- status --serial 16019180
=== PIV device, Serial 16019180: Yubico YubiKey OTP+FIDO+CCID 01 00 (version: 5.2.7) ===
Slot 9A [Authentication]

Slot 9C [Signature]
  Serial:      5f:84:ef:01:df:bc:a6:01:a1:a1:57:14:6b:f7:d1:56:0c:17:a9:ac
  Issuer:      CN=Janus <[email protected]>
  Subject PKI: Rsa2048

Slot 9D [KeyManagement]
  Serial:      67:71:df:e6:e3:e7:c5:7e:36:e6:7a:8c:bc:64:a0:24:0e:63:da:8a
  Issuer:      CN=Janus <[email protected]>
  Subject PKI: Rsa2048

[..]

(添加 -v 标志还会输出完整的 X.509 证书信息,用于调试目的。)

解密

我们将消息加密到 "Janus" 密钥

$ sq key extract-cert /tmp/janus.key --output /tmp/janus.cert
$ echo "hello world" | sq encrypt --recipient-file /tmp/janus.cert > /tmp/enc

然后在 PIV 设备上解密它

$ cat /tmp/enc | cargo run -- decrypt --serial 16019180 --cert /tmp/janus.key

签名

类似地,我们可以在 PIV 设备上生成 OpenPGP 签名

$ echo "foo" | cargo run -- sign --serial 16019180 --cert /tmp/janus.cert > /tmp/sig

并验证签名

$ echo "foo" | sq verify --signer-file /tmp/janus.cert --detached /tmp/sig

依赖项

~42–58MB
~1M SLoC