如何使用RFC3161(信任)时间戳,以证明提交的年龄在我的Git仓库?(How can I use

2019-07-30 21:54发布

更新

我已经发布了一个脚本,我用这个给StackExchange代码审查现场。

我给这家原来的问题是有没有一种方法可以让我签一个Git与X.509证书和时间戳承诺? 。 有一段时间,我想我只能得到的东西我已经通过可信的第三方时间戳,我的X.509证书签名。 不是这种情况。 数字签名与X.509证书和可信的时间戳是互斥的。 我已经更新了我的问题,以反映这一点。

正如VonC指出,签署的Git与X.509证书承诺不添加任何价值。 使用GPG密钥是因为Git的内置支持的一个更好的选择。

我已经接受了格雷格的答案,因为它是最接近我所要求的,即使我原来的问题是有点暧昧。 由于格雷格指出,如果你能证明你在某一时间点,那保证你知道的信息库内容的哈希是在那个时候,有没有必要存储在仓库中的任何额外的数据就知道提交哈希值。 时间戳数据可以在任何地方进行存储。

它可以使用openssl (V1.0.0 +),并curl要求RFC3161时间戳提交哈希值。

请求时间戳

你需要有一点这个信息的:

  • URL - 一个RFC3161时间戳服务
  • REV - 修订(散)你想为一个timstamp。 必须是一个完整的哈希值。
CONTENT_TYPE="Content-Type: application/timestamp-query"
ACCEPT_TYPE="Accept: application/timestamp-reply"

openssl ts -query -cert -digest "$REV" -sha1 \
    | curl -s -H "$CONTENT_TYPE" -H "$ACCEPT_TYPE" --data-binary @- $URL

上面的代码将输出签署时间戳stdout 。 此外,如果时间戳服务拒绝请求它可以输出一个错误。

验证时间戳

这是非常相似的请求时间戳,但你还需要:

  • 凭证档案错误 - 从时间戳服务回根CA证书链

该时间戳服务应签署时间戳与被信任的机构颁发的证书。 如果没有,你的时间戳没有多少可信度。 如果您无法找到或创造一个适当的证书链,尝试使用cacert.pem发表curl 。 这是在这里 。

以下代码段有一个前提,签署时间戳的答复被传递给stdin 。 它应该是可能的管上述请求直接进入下面验证命令。 如果从存储在变量中请求的响应,可能有必要为base64编码/解码它( man base64 )。

openssl ts -verify -digest "$REV" -in /dev/stdin -CAfile "$CAFILE"

如果您检查的答复,你会发现消化物使用的Git的版本相匹配的请求。 您可以检查此命令的回应的纯文本版本。

openssl ts -reply -in /dev/stdin -text

这里就是我在上面添加的Git版本的答复的例子。

--------------------------------------------------------------------------------
Revision: 871d715e5c072b1fbfacecc986f678214fa0b585
--------------------------------------------------------------------------------
Status info:
Status: Granted.
Status description: unspecified
Failure info: unspecified

TST info:
Version: 1
Policy OID: 1.3.6.1.4.1.6449.2.1.1
Hash Algorithm: sha1
Message data:
    0000 - 87 1d 71 5e 5c 07 2b 1f-bf ac ec c9 86 f6 78 21   ..q^\.+.......x!
    0010 - 4f a0 b5 85                                       O...
Serial number: 0xB2EA9485C1AFF55C6FFEDC0491F257C8393DB5DC
Time stamp: Aug 15 08:41:48 2012 GMT
Accuracy: unspecified
Ordering: no
Nonce: 0x615F0BF6FCBBFE23
TSA: DirName:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO Time Stamping Signer
Extensions:

其他注意事项

很多时间戳服务要求用户延迟添加脚本签名请求。 请确保你发现如果你打算使用该服务需要它。 在写一个我使用,科摩多的时间,询问脚本请求之间有15秒的延迟。 我选择使用魔岛的唯一原因是因为这是谁,我买我的代码签名证书的。

Git的笔记似乎是用于存储签署时间戳的答复是显而易见的选择,但我不太有一个完整的解决方案发布。 我卡在此的时刻。

我原来的问题和更新如下。


我希望能够我的Git修订正在发生,我的仓库的历史并没有被重新写入证明。 它不必是每次提交。 每天一次或每周一次就足够了。 有没有推荐的方式来做到这一点?

我知道我可以签署的Git用GPG键提交,但我不知道是否有一种方法可以让我签我的提交与X.509证书和使用像一个在线时间戳服务的HTTP://timestamp.comodoca .COM / rfc3161 。

如果没有,就用倾倒当前版本git rev-parse --verify HEAD到一个文本文件,每天一次,签署该文件,并提交足以证明(大约),当我写的代码?

新增信息为清楚起见

我知道了Git保证了仓库的完整性,但是,据我了解,如果我控制库第三方将不得不相信,我没有重新编写的库的历史或卷起我的时光倒流和创造了一个完全虚假资料库只是为了“证明”我的代码是年纪比它实际上是? 我也不想公开发布我的仓库。

这里是一个虚构的使用情况,应该给什么,我想做一个更好的主意。

我在网上发布一些代码。 一年后,有人复制,并在书或文章,并索赔发布相同的代码我是复制他们的人。 在这一点上,我希望能够把我的资料库,并证明我犯下的代码年前,他们重新发布之前。

通过使用X.509证书与时间戳服务签约有发生,我可以证明。 只要我能证明我所知道的哈希为岁的提交,Git的保证档案的完整性。

另外,有签署承诺使用GPG密钥的一种方式,但与经过验证的时间戳? 是否有值得信赖的第三方提供类似于可用于X.509证书的那些一个时间戳服务,但对于GPG?

也许我可以用GPG密钥和X.509证书的组合。 假设我把我的(公共)GPG密钥的副本存储库中的,将下面的工作,如果我做到了,在每一天结束了吗?

  1. 用我的X.509证书和网上时间戳服务注册我的(公共)GPG密钥。
  2. 提交变更到存储库与我(私)GPG密钥签名。

Answer 1:

所有你需要做的,就是发布SHA1(提交ID)公开。 如果你喜欢,你可以采取的SHA1和你的X.509证书签名(用适当的时间戳服务),并保持周围。 如果有人挑战自己的作者,你可以很容易地表明,你知道的资料库的内容,在生成特定SHA1的特定时间。 你并不需要任何实际签名存储代码库里面



Answer 2:

只是一个时间戳记证书添加到您的最新承诺。 该SHA1将验证证书没有被修改,并且该证书本身将验证所有这些“事实”,它声称,如日期和时间标记从受信任的服务器,你谁声称要等那是,提交标志证书,按照从Linus的讲话VonC的报价;-)


[编辑]显然,你需要发布新提交的SHA1,否则你可能会修改它(和证书),并使用新的SHA1要求无论是在新提交的历史。 一如往常它是创造相互信任的网络。



Answer 3:

我不usre我跟随,因为莱纳斯没有作出的Git在考虑特定功能(即你所投入的完整性 正是出来)

看到的是,在谷歌2007年的讲话 ( 成绩单 ):

他们中的大多数,我可以放弃,甚至没有尝试出来。

  • 如果你不分配,你是不值得使用,就这么简单。
  • 如果你表现不好,你是不值得使用,它就是这么简单。
  • 如果你不能保证我投入到SCM的东西出来一模一样,你是不值得使用

坦率地说,这几乎把一切照顾在那里。

有很多不保证你摆脱它再次什么是你把同样的事情SCM系统。
如果你有一个内存破坏,如果你有一个光盘损坏,你可能永远不会知道。
你所知道的唯一的办法就是你注意到出现在文件的损坏,当你检查出来。 和源控制管理系统并不能保护你的。
而这甚至不是少见。 这是非常非常常见。 。

所以,我不认为增加一个完整功能将增加任何价值。
而“时间戳”是不完全是一个好主意,或者,因为它们没有在第一时间记录的DVCS(见“ 混帐:检出旧文件,原来的创建/修改的时戳 ”和“ 什么是相当于使用提交-时间混帐? “)



Answer 4:

我只是写了一个名为“GitLock”正是为此目的计划。 它增加了信任时间戳您的回购协议。

https://www.npmjs.com/package/gitlock



文章来源: How can I use RFC3161 (trusted) timestamps to prove the age of commits in my Git repository?