git用gpg私钥签名一个标签

git用gpg私钥签名一个标签,我自己在实践时遇到很多困难,查阅了许多资料,所以写下这篇希望能帮助到git初学者以及gpg初使用者。git tag -s签名采用PGP签名,因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错.

对信息加密和解密要用到GnuPG软件(简称GPG),它是目前最流行、最好用的加密工具之一。
一、GPG
1991年,程序员Phil Zimmermann为了避开政府监视,开发了加密软件PGP。这个软件非常好用,迅速流传开来,成了许多程序员的必备工具。但是,它是商业软件,不能自由使用。所以,自由软件基金会决定,开发一个PGP的替代品,取名为GnuPG。这就是GPG的由来。
GPG有许多用途,文件加密、邮件加密等等。
二、安装

我是使用cygwin在学习git,默认安装时没有安装gpg,重新安装选择一下gpg就可以使用了。
如果跟我不一样的话,GPG有两种安装方式。可以下载源码,自己编译安装。
  ./configure
  make
  make install
也可以安装编译好的二进制包。
  # Debian / Ubuntu 环境
  sudo apt-get install gnupg
  # Fedora 环境
  yum install gnupg
安装完成后,键入下面的命令:
  gpg --help
如果屏幕显示GPG的帮助,就表示安装成功。

三、生成密钥
安装成功后,使用gen-ken参数生成自己的密钥。
  gpg --gen-key
回车以后,会跳出一大段文字:
$ gpg --gen-key
gpg (GnuPG) 1.4.21; Copyright (C) 2015 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
  请选择您要使用的密钥种类:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (仅用于签名) 
   (4) RSA (仅用于签名)
  您的选择?
第一段是版权声明,然后让用户自己选择加密算法。默认选择第一个选项,表示加密和签名都使用RSA算法。
然后,系统就会问你密钥的长度。
  RSA 密钥长度应在 1024 位与 4096 位之间。
  您想要用多大的密钥尺寸?(2048)
密钥越长越安全,默认是2048位。
接着,设定密钥的有效期。
  请设定这把密钥的有效期限。
    0 = 密钥永不过期
   <n> = 密钥在 n 天后过期
   <n>w = 密钥在 n 周后过期
   <n>m = 密钥在 n 月后过期
   <n>y = 密钥在 n 年后过期
  密钥的有效期限是?(0)
如果密钥只是个人使用,并且你很确定可以有效保管私钥,建议选择第一个选项,即永不过期。回答完上面三个问题以后,系统让你确认。
  以上正确吗?(y/n)
输入y,系统就要求你提供个人信息。
  您需要一个用户标识来辨识您的密钥;本软件会用真实姓名、注释和电子邮件地址组合成用户标识,如下所示:
  "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"
  真实姓名:
  电子邮件地址:
  注释:
"真实姓名"填入你姓名的英文写法,"电子邮件地址"填入你的邮件地址,"注释"这一栏可以空着。
然后,你的"用户ID"生成了。
  您选定了这个用户标识:
   "Zoey Zhang <shinezzm@foxmail.com>"
我的"真实姓名"是Zoey Zhang,"电子邮件地址"是shinezzm@foxmail.com,所以我的"用户ID"就是"Zoey Zhang <shinezzm@foxmail.com>"。系统会让你最后确认一次。
  更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?
输入O表示"确定"。
接着,系统会让你设定一个私钥的密码。这是为了防止误操作,或者系统被侵入时有人擅自动用私钥。
  您需要一个密码来保护您的私钥:
然后,系统就开始生成密钥了,这时会要求你做一些随机的举动,以生成一个随机数。
  我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
几分钟以后,系统提示密钥已经生成了。
  gpg: 密钥 C604E1DD 被标记为绝对信任
  公钥和私钥已经生成并经签名。
请注意上面的字符串"C604E1DD",这是"用户ID"的Hash字符串,可以用来替代"用户ID"。
这时,最好再生成一张"吊销证书",以备以后密钥作废时,可以请求外部的公钥服务器撤销你的公钥。
  gpg --gen-revoke [用户ID]

然后会问你(y/n)

选择原因并输入密码即可
上面的"用户ID"部分,可以填入你的邮件地址或者Hash字符串(以下同)。
四、密钥管理
4.1 列出密钥
list-keys参数列出系统中已有的密钥.
  gpg --list-keys
显示结果如下:
/home/Administrator/.gnupg/pubring.gpg
--------------------------------------
pub   2048R/C604E1DD 2017-06-14
uid                  Zoey Zhang <shinezzm@foxmail.com>
sub   2048R/06E14C7F 2017-06-14
第一行显示公钥文件名(pubring.gpg),第二行显示公钥特征(4096位,Hash字符串和生成时间),第三行显示"用户ID",第四行显示私钥特征。
如果你要从密钥列表中删除某个密钥,可以使用delete-key参数。
  gpg --delete-key [用户ID]
4.2 输出密钥
公钥文件(.gnupg/pubring.gpg)以二进制形式储存,armor参数可以将其转换为ASCII码显示。
  gpg --armor --output public-key.txt --export [用户ID]
"用户ID"指定哪个用户的公钥,output参数指定输出文件名(public-key.txt)。
类似地,export-secret-keys参数可以转换私钥。
  gpg --armor --output private-key.txt --export-secret-keys
4.3 上传公钥
公钥服务器是网络上专门储存用户公钥的服务器。send-keys参数可以将公钥上传到服务器。
  gpg --send-keys [用户ID] --keyserver hkp://subkeys.pgp.net
使用上面的命令,你的公钥就被传到了服务器subkeys.pgp.net,然后通过交换机制,所有的公钥服务器最终都会包含你的公钥。
由于公钥服务器没有检查机制,任何人都可以用你的名义上传公钥,所以没有办法保证服务器上的公钥的可靠性。通常,你可以在网站上公布一个公钥指纹,让其他人核对下载到的公钥是否为真。fingerprint参数生成公钥指纹。
  gpg --fingerprint [用户ID]
4.4 输入密钥
除了生成自己的密钥,还需要将他人的公钥或者你的其他密钥输入系统。这时可以使用import参数。
  gpg --import [密钥文件]
为了获得他人的公钥,可以让对方直接发给你,或者到公钥服务器上寻找。
  gpg --keyserver hkp://subkeys.pgp.net --search-keys [用户ID]
正如前面提到的,我们无法保证服务器上的公钥是否可靠,下载后还需要用其他机制验证.


五、git用gpg私钥签名一个标签(版本库的快照)

$ git tag -u "C604E1DD" -s v0.2 -m "signed version 0.2 released" 5b3dd17

注意:一定要加入-u “用户ID” ,否则会报错

命令执行后会要求我们输入密码,若我们使用

$ git tag -v v0.2查看:


object 5b3dd178ff0b50c88e581cc0df94d27774fd9a05
type commit
tag v0.2
tagger Zoey <shinezzm@foxmail.com> 1497414157 +0800


signed version 0.2 released
gpg: 警告:正在使用不安全的内存!
gpg: 请访问 http://www.gnupg.org/documentation/faqs.html 以获得更详细的信息
gpg: 签名建立于 2017年06月14日 12:22:37 CST
gpg:               使用 RSA 密钥 0DE28324C604E1DD
gpg: 完好的签名,来自于“Zoey Zhang <shinezzm@foxmail.com>”

或者命令$ git show v0.2

查看结果如下:

tag v0.2
Tagger: Zoey <shinezzm@foxmail.com>
Date:   Wed Jun 14 12:22:37 2017 +0800


signed version 0.2 released
-----BEGIN PGP SIGNATURE-----


iQEcBAABAgAGBQJZQLoNAAoJEA3igyTGBOHdDekH/RSXjlSDNAEW8c8p7o1A4vMq
4jRMPOms29RcdtiQERToj3zv88HEwmsMqIMH3sWMa1hM8O/YhqMJlmVApdcAJ2Ed
TqsCKn+XHhtbboMcBLH/KF7u9lSjoIPtcE/jOyBZUFiy0H53G7j19B4u4tKp8V7f
Zk+5bONTWjBrI8txz1FCjbtzQc9WdpiKXCfrMJ1SOteuKeV6GKG4jfM7AcalbAq4
ncP0Cy8O9NHVY7Tp2dQ770GHxvCpp7Qa7vlzhuZKAf+hEzb45LacXrxIgwGGR5l0
FBuZtIS9miPuMHgldw+HxFB/N4gJKlSq6fDL9ZXIfatalLZFXhom/zgyrKGoXG4=
=SvXi
-----END PGP SIGNATURE-----


commit 5b3dd178ff0b50c88e581cc0df94d27774fd9a05
Author: Zoey <shinezzm@foxmail.com>
Date:   Fri Jun 9 09:49:10 2017 +0800

.......(后面略了)


六、常规加密和解密
6.1 加密
假定有一个文本文件demo.txt,怎样对它加密呢?
encrypt参数用于加密。
  gpg --recipient [用户ID] --output demo.en.txt --encrypt demo.txt
recipient参数指定接收者的公钥,output参数指定加密后的文件名,encrypt参数指定源文件。运行上面的命令后,demo.en.txt就是已加密的文件,可以把它发给对方。
6.2 解密
对方收到加密文件以后,就用自己的私钥解密。
  gpg --decrypt demo.en.txt --output demo.de.txt
decrypt参数指定需要解密的文件,output参数指定解密后生成的文件。运行上面的命令,demo.de.txt就是解密后的文件。
GPG允许省略decrypt参数。
  gpg demo.en.txt
运行上面的命令以后,解密后的文件内容直接显示在标准输出。


七、常规签名
7.1 对文件签名
有时不需要加密文件,只需要对文件签名,表示这个文件确实是我本人发出的。sign参数用来签名。
  gpg --sign demo.txt
运行上面的命令后,当前目录下生成demo.txt.gpg文件,这就是签名后的文件。这个文件默认采用二进制储存,如果想生成ASCII码的签名文件,可以使用clearsign参数。
  gpg --clearsign demo.txt
运行上面的命令后 ,当前目录下生成demo.txt.asc文件,后缀名asc表示该文件是ASCII码形式的。
如果想生成单独的签名文件,与文件内容分开存放,可以使用detach-sign参数。
  gpg --detach-sign demo.txt
运行上面的命令后,当前目录下生成一个单独的签名文件demo.txt.sig。该文件是二进制形式的,如果想采用ASCII码形式,要加上armor参数。
  gpg --armor --detach-sign demo.txt
7.2 签名+加密
上一节的参数,都是只签名不加密。如果想同时签名和加密,可以使用下面的命令。
  gpg --local-user [发信者ID] --recipient [接收者ID] --armor --sign --encrypt demo.txt
local-user参数指定用发信者的私钥签名,recipient参数指定用接收者的公钥加密,armor参数表示采用ASCII码形式显示,sign参数表示需要签名,encrypt参数表示指定源文件。
7.3 验证签名
我们收到别人签名后的文件,需要用对方的公钥验证签名是否为真。verify参数用来验证。
  gpg --verify demo.txt.asc demo.txt
举例来说,openvpn网站就提供每一个下载包的gpg签名文件。你可以根据它的说明,验证这些下载包是否为真。
八、参考链接
http://www.ruanyifeng.com/blog/2013/07/gpg.html

https://www.gnupg.org/faq/gnupg-faq.html

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001376951758572072ce1dc172b4178b910d31bc7521ee4000


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值