如何使用SSH签名Git提交记录-全球速看
时间:2023-06-16 17:33:32来源:涛叔的博客

Git 支持使用 GPG 来签名提交记录。但 GPG 用起来很复杂,一直赖得搞。


(资料图片)

Git 从 2.34 开始支持使用 SSH 签名。SSH 密钥大家肯定都有,所以开启签名也需要提上日程了。只不过这个功能发布后很长时间内 GitHub 都不支持显示 SSH 签名,我也就没有继续推进。昨天 GitHub 官宣正式支持 SSH 签名。今天就把相关的内容整理一下分享给大家。

首先,为什么要对 Git 提交做签名呢?那是因为在 Git 中很容易伪造提交身份。

我们知道,Git 要求在提交前指定作者名字和邮箱:

gitconfiguser.name涛叔gitconfiguser.emailhi@taoshu.in

但这两个配置可以随便填。任何人都可以声称自己是涛叔。为了保护自己的声誉,我可以用非对称加密技术对提交进行签名,然后公布自己公钥。这样其他人就可以根据这个公钥来验证 Git 变更是不是由我本人提交的。只要我不泄漏自己的私钥,别人就很难伪装成我来做坏事。

实现签名最常见的工具是 GPG。如果你玩过 Linux肯定不陌生,很多发行版的包管理器都使用 GPG 对包做签名,防止坏人伪造。

但 GPG 对小白用户不友好,所以普通 Git 玩家很少会开启签名。一直到 OpenSSH 8.0 发布,局面才有所改观。因为这个版本的 OpenSSH 支持给任意数据进行签名。

签名功能在 OpenSSH 8.7 出问题了,建议使用 8.8 以后的版本

SSH 签名的工具是 ssh-keygen。估计很多人只在第一次生成 SSH 密钥的时候用到过,后面就在没碰过它了。虽然有点奇怪但签名也验签功能也是由 ssh-keygen 提供的。

假设有一个文件/tmp/a.txt,我们想使用~/.ssh/id_ed25519给它做签名,我们可以:

ssh-keygen-Ysign-f~/.ssh/id_ed25519-nfile/tmp/a.txt

各参数的功能如下:

-Y sign表示计算签名

-f指定私钥

-n file是给签名指定类型

file是我们自己定的,不同类型的签名不会产生冲突

执行之后就会得到一个签名文件/tmp/a.txt.sig,内容长这个样子:

-----BEGINSSHSIGNATURE-----U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgulKNunkcVxiDzY0wmqJo4rAG9LClGRq9mMfA/PqsKYkAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5AAAAQP1FljU1ZQ327DZE11wjHIDgz1s0ULi7QO5rhg+MyEn12nwkV0fk69qDqmcpAE562xpIxa+yaGuMV6hK97Hq+gE=-----ENDSSHSIGNATURE-----

有了签名,我们就可以验证是不是有坏人篡改了文件内容了。验证签名需要一个公钥列表:

hi@taoshu.inssh-ed25519AAAAC3NzaC1lZDI1NTE5AAAAILpSjbp5HFcYg82NMJqiaOKwBvSwpRkavZjHwPz6rCmJts@tc...

第一列是公钥的标识,我们这里用的是邮箱。第二列是公钥类型,后面的部分是公钥内容,也就是~/.ssh/id_ed25519.pub的内容。每个公钥占一行。

验签命令如下:

ssh-keygen-Yverify-fallowed_signers-Ihi@taoshu.in-nfile-s/tmp/a.txt.sig

各参数的功能如下:

-Y verify表示要验证签名

-f 用来指定公钥列表文件

-I 指定使用公钥标识

-n file 需要跟签名的时候保持一致

-s 指定签名所在文件

最后通过重定向将文件内容传给 ssh-keygen。如果验证通过,则会得到如下结果:

Good"file"signatureforhi@taoshu.inwithED25519keySHA256:19/J4WKT7flBNcfmqQUqyAZeH4TdhMf5f0u+a4fZj1c

如果有人修改了文件内容,则会得到如下结果:

Signatureverificationfailed:incorrectsignatureCouldnotverifysignature.

考虑到大多数 Git 用户都有自己的 SSH 密钥,不支持 SSH 签名岂不是很浪费?于是 Git 2.34 集成了 SSH 签名功能。

我们需要添加如下配置:

#使用SSH签名gitconfiggpg.formatssh#指定SSH私钥文件gitconfiguser.signingKey~/.ssh/id_ed25519.pub#指定可信公钥列表文件gitconfiggpg.ssh.allowedSignersFile"$HOME/.config/git/allowed_signers"#开启自动签名(可选)gitconfigcommit.gpgsigntruegitconfigtag.gpgsigntrue

一番操作之后就准备好了。接下来所有的 Git 提交都会使用 SSH 签名。如果没有开启自动签名,则可以在提交的时候通过-s参数来临时开启。

在默认配置下,我们看不出签名后的提交跟普通提交有什么区别。如果想展示签名信息,需要指定--show-signature参数:

gitshow--show-signature|headcommit6292a43f184e8a347b6c8b4fe08191920c0e22a5Good"git"signatureforhi@taoshu.inwithED25519keySHA256:19/J4WKT7flBNcfmqQUqyAZeH4TdhMf5f0u+a4fZj1cAuthor:涛叔Date:WedAug2407542022+0800支持给TS的枚举类型生成toString/parser函数diff--gita/autoload/lv.vimb/autoload/lv.vimindex22a6b38..a08deb9100644---a/autoload/lv.vim...

这个时候我们就看到了Good "git" signatures ...验证消息。

如果你使用 tig,也应该添加同样的参数,或者在~/.tigrc中开启如下配置:

setlog-options=--show-signaturesetdiff-options=--show-signature

回想我们前面的例子,当-n的值为file的时候,验签信息是Good "file"...。现在的信息是Good "git"...,说明 Git 使用的参数是-n git。

但有个问题,Git 到底把签名信息存到了什么地方呢?答案是 commit 或者 tag 对应的 object。如果你不了解 Git 的存储模型,可以阅读我的另一篇文章。

我们可以使用cat-file查看对象保存的内容:

$gitcat-filecommit6292a43f184e8a347b6c8b4fe08191920c0e22a5treec17c1e92312dc7303018c3dc3cd25d26007305e2parente71d24c876aa6e82a69e1566623083923edcab03author涛叔1661298954+0800committer涛叔1661298954+0800gpgsig-----BEGINSSHSIGNATURE-----U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgulKNunkcVxiDzY0wmqJo4rAG9LClGRq9mMfA/PqsKYkAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5AAAAQP1FljU1ZQ327DZE11wjHIDgz1s0ULi7QO5rhg+MyEn12nwkV0fk69qDqmcpAE562xpIxa+yaGuMV6hK97Hq+gE=-----ENDSSHSIGNATURE-----支持给TS的枚举类型生成toString/parser函数

大家看 gpgsig 这一行,表示当前提交的签名信息。后面的每一行前面都有一个空格,表示这些行跟 gpgsig 是一个整体。

那 Git 是怎样签名的呢?我没有去看源码。但我猜是去掉 gpgsig 签名信息,然后对剩余的内容计算签名,签名类型为 git。于是我把对应的内容保存成文件签了一下,跟 gpgsig 的值完全一致。

Git 签名很好地解决了分装身份的问题。但如果对应功能没办法在 GitHub 上显示,那就不够炫酷。所以 Git 2.34 刚发布就有用户建议 GitHub 添加支持。昨天终于上线了

虽然 GitHub 支持展示 SSH 签名信息,但是签名和鉴权用的密钥需要分别上传。上传的时候需要指定类型。哪怕是使用同一个密钥也得额外再传一次。

上传公钥之后,GitHub 就会展示对应的 SSH 签名。

以上就是本文的全部内容,希望能给大家一些参考。欢迎留言讨论。

审核编辑:汤梓红

标签:

  • 上一篇文章: 地震和宇宙辐射之间有趣的相关性
  • 下一篇文章: 最后一页
  • 生活指南
  • 环球关注:周的成语开头的成语有哪些 周的成语

    今天来聊聊关于周的成语开头的成语有哪些,周的成语的文章,现在就为大

  • 暑期防溺水 安全记心间

    暑期临近,江西省南昌市各县区中小学校纷纷开展暑期安全教育主题活动,

  • 焦点精选!2023年宁波方特端午优惠门票购票攻略

    端午优惠门票购票攻略一、门票预售抢购时间:即日起至6月20日使用时间

  • 如何在弱市中选股?炒中长线如何选股?|天天观点

    如何在弱市中选股?反向选股法:仔细观察盘面变化,主力资金经常会在

  • 个人自费有必要买社保吗?辞职后社保怎么自己续交?

    没单位个人社保怎么交?1、找一家社保代理机构,可以让社保代理帮你

  • 郑州仙佑膏药积极应对市场变化 技术创新成为制胜关键

    作为国内知名的膏药代加工企业之一,仙佑集团已经拥有了多年的历史

  • 为什么股票清仓要留100股?卖股票留底仓与清仓哪个好?

    想必现在有很多小伙伴对于股票和基金的知识都比较想要了解,那么今

  • 当前要闻:个体户报税一年申报几次?个体户逾期申报怎么解决?

    个体户报税一年申报几次?第一步:登录当地电子税务局(本案例以北京

  • 乱倾倒垃圾会受到什么处罚?倾倒垃圾污染环境的判定

    一、乱倾倒垃圾怎么举报的?去房管局进行投诉,由业委会处理。乱倒垃

  • 全球短讯!csgo开箱有哪些技巧?csgo开箱有什么玄学吗?

    CSGO是一款全球火爆的游戏,每天都涌入大量新人玩家,而CSGO也是一

  • 郑州仙佑独家秘制膏药配方,品质保证备受消费者青睐 世界热点

    仙佑集团膏药代生产厂家了解到,膏药是一种古老的传统中药制剂,具

  • 手机处理器哪一种好一些?天玑和骁龙哪个好

    手机处理器哪一种好一些目前所有手机处理器的性能排行榜!CPU层面:

  • 每日时讯!神光同步灯效是什么?神光同步怎么接线

    神光同步灯效是什么所谓的神光同步原理其实很简单,就是通过主板让

  • 余额宝5万能一下转出吗?余额转入余额宝的钱怎么转到银行卡?

    余额宝5万能一下转出吗?余额宝5万不能一下转出,因为快速赎回限额一万元,也就是每天只有1万元的额度,那如

  • 国网信通股票代码是多少?国网信通股票行情怎么样?

    国网信通股票代码是多少?600131 国网信通公司前身为四川岷江水利电力股份有限公司。1993年12月经四川省

  • 多张信用卡逾期后果是什么?信用卡逾期会影响额度吗?

    多张信用卡逾期后果是什么?1、支付逾期违约金。当用户在还款日到期的时候还没有按时进行还款或者没有还

  • 民生
    • A股房地产板块午后异动拉升,万通发展涨近7%-天天动态

    • 向太晒全家福为儿子庆周岁,拥抱郭碧婷大秀恩爱,感恩父母与老婆

    • 【全球时快讯】延迟年报是不是业绩亏损?推迟年报是利空吗?

    • 每日快报!遗产按照什么顺序继承?继子会有继承权吗?