#openpgp #ssh #ssh-key #public-key #pgp #authentication #trust-anchor

bin+lib ssh-openpgp-auth

命令行工具,提供客户端功能,以透明地验证远程SSH主机的身份

4个版本

0.2.2 2024年2月29日
0.2.1 2024年2月10日
0.2.0 2024年2月10日
0.1.0 2024年1月19日

密码学类别的排名:1751

每月下载量:39

许可:Apache-2.0 OR MITLGPL-2.0-or-later

39KB
472 代码行

ssh-openpgp-auth

此工具提供客户端功能,以基于用户OpenPGP配置的信任链透明地验证远程SSH主机的身份。

具体来说,在打开SSH连接之前,此工具会获取远程SSH主机的OpenPGP证书。根据OpenPGP信任链验证主机证书,从用户配置的信任根开始。如果有有效的信任链,此工具会将远程主机的SSH公钥添加到本地OpenSSH "已知主机"配置中。

为了优雅地处理主机密钥的生命周期事件,当远程主机的OpenPGP证书过期时,它会自动刷新。

所有OpenPGP证书都存储在本地标准CertD目录中(例如,在Linux上,默认路径是.local/share/pgp.cert.d,参见3.8. 平台特定约定)。

安装

此工具可以按每个远程主机使用,也可以通过编辑.ssh/config文件全局使用

Host example.com
	KnownHostsCommand /usr/bin/ssh-openpgp-auth authenticate %H

(作为支持SSH OpenPGP证书的示例真实主机,可以使用metacode.biz而不是example.com)。

验证标志

默认情况下,此工具会获取缺少的证书并在远程主机证书上执行基本完整性检查。可以通过追加附加标志来启用更严格的检查。附加验证标志会导致工具执行更严格的检查。

信任网络验证(--verify-wot

以下示例说明如何在用户的OpenPGP证书存储中定义信任根,以使用信任网络进行主机证书验证。

请注意,如果用户已经设置了Web of Trust(例如,依赖其组织的OpenPGP CA实例),这些信任根将自动利用。这个工具将“直接工作”,并依赖于从信任根到远程主机证书的链。远程主机证书将自动通过网络(使用WKD协议)获取,并且每次工具运行时都会在本地进行信任计算。

DNS/Keyoxide证明验证(--verify-dns-proof

此验证需要主机DNS区域中存在密钥指纹

$ dig +short TXT metacode.biz
"openpgp4fpr:198c722a4bac336e9daaae44579d01b3abe1540e"
"openpgp4fpr:653909a2f0e37c106f5faf546c8857e0d8e8f074"

具体格式将在未来指定(参见问题#25)。

使用示例

让我们在隔离环境中运行一次使用此工具的示例。为了设置测试环境,我们配置一个临时目录用作OpenPGP证书存储

export SQ_CERT_STORE=$(mktemp -d)
export PGP_CERT_D=$SQ_CERT_STORE

然后,我们将示例主机证书(指纹为D9E95D7F42E87610676C40B47E8432836DA1625E)导入到我们的临时本地证书存储,并直接将其配置为本地信任根

sq cert import < fixtures/example.asc

sq pki link add --all D9E95D7F42E87610676C40B47E8432836DA1625E

将证书定义为信任根后,“已知主机”配置包含一个SSH格式的认证密钥

KNOWN_HOSTS=$(ssh-openpgp-auth authenticate --verify-wot example.com)

[ "$KNOWN_HOSTS" = "example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN1KLfPT949Gq15XcaTkxFntkp6fFyoNq0JkPOKaktJM F5CEDEED08E9EA536034F5823475162385DF08AF" ]

可以使用--verbose标志添加更多详细输出,以查看已找到哪些信任根以及正在使用哪些证书

KNOWN_HOSTS=$(ssh-openpgp-auth authenticate --verbose --verify-wot example.com)

# Note that the trust root is automatically generated by sq thus cannot
# be mentioned here verbatim
RE='^# Found trust root: [A-F0-9]+
# Found local cert: D9E95D7F42E87610676C40B47E8432836DA1625E
# Using cert store: .*
# Web of Trust verification of D9E95D7F42E87610676C40B47E8432836DA1625E succeeded
# Certificate D9E95D7F42E87610676C40B47E8432836DA1625E, exporting subkey F5CEDEED08E9EA536034F5823475162385DF08AF
example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN1KLfPT949Gq15XcaTkxFntkp6fFyoNq0JkPOKaktJM F5CEDEED08E9EA536034F5823475162385DF08AF'

[[ "$KNOWN_HOSTS" =~ $RE ]]

接下来,我们再次撤销链接,这意味着我们不再依赖此证书作为信任根。

请注意,由于OpenPGP签名的日期时间解析限制在整秒,我们等待两秒钟以确保更改的信任根配置生效

sleep 2
sq --force pki link retract D9E95D7F42E87610676C40B47E8432836DA1625E '<[email protected]>'
sleep 2

取消设置此信任根后,SSH“已知主机”配置再次为空,因为Web of Trust验证没有产生任何有效的SSH主机证书

KNOWN_HOSTS=$(ssh-openpgp-auth authenticate --verify-wot example.com)

[ "$KNOWN_HOSTS" = "" ]

捕获验证

可以使用带有--store-verifications选项的authenticate命令捕获验证结果。使用它,验证结果将作为OpenPGP证书添加到主机的证书中

sq cert import < fixtures/example.asc

sq pki link add --all D9E95D7F42E87610676C40B47E8432836DA1625E
sleep 2 # wait so that the binding becomes valid

ssh-openpgp-auth authenticate --verify-wot --store-verifications example.com

请注意,此工具创建的证书是本地的且不可导出。它们仅用于在运行ssh-openpgp-auth的机器上持久化证明验证结果。

可以使用sqgpg来检查证书

gpg --list-packets $PGP_CERT_D/d9/e95d7f42e87610676c40b47e8432836da1625e | grep -C 5 ssh-openpgp-auth-verification

输出内容

	version 4, created 1706631963, md5len 0, sigclass 0x13
	digest algo 10, begin of digest a3 9b
	critical hashed subpkt 2 len 4 (sig created 2024-01-30)
	critical hashed subpkt 4 len 1 (not exportable)
	hashed subpkt 16 len 8 (issuer key ID 07346F19049471F6)
	hashed subpkt 20 len 53 (notation: ssh-openpgp-auth-verification@metacode.biz=wot)
	hashed subpkt 20 len 70 (notation: salt@notations.sequoia-pgp.org=[not human readable])
	hashed subpkt 33 len 21 (issuer fpr v4 8C56EB2309B51FF2EF3621C407346F19049471F6)
	data: [256 bits]
	data: [256 bits]

结果存储为ssh-openpgp-auth-verification@metacode.biz表示法,其中值是以下值的连接

  • dns - DNS证明已验证。
  • wot - Web of Trust验证成功。

资助

该项目由NGI Assure资助,该基金由NLnet设立,并由欧洲委员会的下一代互联网计划提供财务支持。更多信息请访问NLnet项目页面

NLnet foundation logo NGI Assure Logo

许可证

该项目受以下任一许可证的许可

任选。

贡献

除非您明确声明,否则您提交给此crate的任何有意包含的贡献,根据Apache-2.0许可证定义,将按上述方式双许可,不附加任何额外条款或条件。

依赖关系

~73MB
~1.5M SLoC