更新
我已经发布了一个脚本,我用这个给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密钥的副本存储库中的,将下面的工作,如果我做到了,在每一天结束了吗?
- 用我的X.509证书和网上时间戳服务注册我的(公共)GPG密钥。
- 提交变更到存储库与我(私)GPG密钥签名。