gitsign
用Sigstore进行无钥匙的Git签名!
这在很大程度上受到github.com/github/smim… 的启发,但使用无钥匙的 Sigstore 来用你自己的 GitHub / OIDC 身份签署 Git 提交。
安装
go install github.com/sigstore/gitsign@latest
配置
单一存储库。
cd
所有存储库。
git config --global commit.gpgsign
环境变量
| 环境变量 | 默认值 | 环境变量描述 |
|---|---|---|
| gitsign_fulcio_url | fulcio.sigstore.dev | Fulcio服务器的地址 |
| GITSIGN_LOG | 记录状态输出的路径。有助于调试,因为 Git 不会将 stderr 输出转发给用户终端。 | |
| gitsign_oidc_client_id | sigstore | 应用程序的 OIDC 客户端 ID |
| gitsign_oidc_issuer | oauth2.sigstore.dev/auth | 用于发行ID令牌的OIDC提供商 |
| gitsign_oidc_redirect_url | OIDC重定向URL | |
| gitsign_rekor_url | rekor.sigstore.dev | Rekor服务器的地址 |
使用方法
一旦配置好,你就可以像往常一样用git commit -S (或者git config --global commit.gpgsign true ,以便对所有提交进行签名)来签署提交。
$ git commit --allow-empty --message=
这将引导你通过Sigstore无密钥流程来验证和签署提交。
然后可以用git log 来验证提交。
$ git --no-pager log --show-signature -1
commit 227e796042fdd170e58b7e3b7627a1badd320224 (HEAD -
限制
-
当 Git 调用签名工具时,stdout 和 stderr 都会被捕获,这意味着
gitsign无法以交互方式推回信息给 shell。正因为如此,设备模式不能与gitsign一起使用 - 需要一个能够使用浏览器的会话来签署提交文件。 -
GitHub目前不承认gitsign的签名是经过验证的。
- sigstore的CA根不是GitHub信任根的一部分。
- 因为gitsign的短暂密钥只在短时间内有效,使用标准的x509验证会认为证书过期后无效。验证需要包括通过Rekor进行验证,以验证证书在使用时是有效的。
我们希望与GitHub合作,使这些类型的签名在未来被认可为已验证的签名
调试
如果在签名过程中出现了错误,你可能会看到类似的错误。
error: gpg failed to sign the data
fatal: failed to write commit object
由于 Limitations与 Git 签名工具,gitsign 不能写回 stderr。相反,你可以使用GITSIGN_LOG 环境变量,将日志写到一个可读的位置,以便调试。
隐私
Gitsign存储哪些数据?
Gitsign 将数据存储在两个地方。
-
在 Git 提交中
提交本身包含用户提交内容的签名摘要(如作者、提交者、消息、父辈等)以及代码签名证书。这些数据作为仓库的一部分保存在提交本身中。更多细节请参见检查 Git 提交签名。
-
在 Rekor 透明度日志中
为了能够验证过了
Not After时间的短暂证书的签名,gitsign 将提交和代码签署证书记录到Rekor。该数据是一个HashedRekord,包含提交SHA256的哈希值,以及代码签名证书。更多细节请参见验证透明度日志。默认情况下,数据被写入公共Rekor实例。特别是,用户和组织可能对Fulcio返回的代码签名证书m中包含的数据很敏感,其中可能包括用户的电子邮件或 repo标识符。请参阅Fulcio中的OIDC用法,以了解代码签名证书中包含哪些数据的更多细节,以及手动部署Rekor服务器,以了解如何运行你自己的Rekor实例。
安全问题
如果你发现任何安全问题,请参考sigstores的安全程序。
高级
检查 Git 提交的签名
Git 提交签名使用CMS/PKCS7 签名。我们可以检查运行所使用的基础数据/证书。
$ git cat-file commit HEAD
验证透明性日志
作为签名验证的一部分,gitsign ,不仅要检查给定的签名是否与提交相匹配,还要检查该提交是否存在于Rekor的透明日志中。
我们可以通过运行以下程序来手动验证该提交是否存在于透明日志中。
$ uuid=
注意,Rekor条目使用的是用于生成git提交签名的相同证书。这可以用来关联这两条信息,尽管它们签署了不同的内容。
