1. 程式人生 > >gpg --sign對檔案簽名&expect呼叫sign&Jenkins呼叫expect指令碼

gpg --sign對檔案簽名&expect呼叫sign&Jenkins呼叫expect指令碼

GnuPG是目前最流行、最好用的加密工具之一。
用gpg --help可以檢視相關提示和gpg版本資訊,本文主要使用了2.0.14和1.4.10兩個版本


1. gpg --gen-key
在對檔案進行前面前,首先要生成公私鑰,gpg --gen-key
中間需要輸入使用者名稱等資訊,還需要輸入一個密碼,來保護金鑰的使用。這個密碼在進行sign簽名的時候會用到
gen-key命令執行結果如下:
===============
gpg: 正在檢查信任度資料庫
gpg: 需要 3 份勉強信任和 1 份完全信任,PGP 信任模型
gpg: 深度:0 有效性:  2 已簽名:  0 信任度:0-,0q,0n,0m,0f,2u
pub   2048R/9A384DA1 2017-07-12
金鑰指紋 = B180 CAEC A20F E1F9 945C  5D00 563D FB0F 9A38 4DA1
uid                  KMProduct (SIQST) <
[email protected]
>
sub   2048R/5123DD13 2017-07-12
===============
其中9A384DA1是,是使用者ID的Hash字串,可以代替使用者ID使用。

後期可以通過下面的命令檢視查詢所有生成的公私鑰資訊:
==========
[[email protected] workspace]# gpg --list-key
/root/.gnupg/pubring.gpg
------------------------
pub   2048R/9A384DA1 2017-07-12
uid                  NAME (comments) <
[email protected]
>
sub   2048R/5123DD13 2017-07-12
==========

2. gpg --sign $fileName

sign命令用於給檔案簽名,簽名時,提示需要輸入gen-key時,輸入的密碼,如圖


gpg2.0.14提示如上圖,而1.4.10的密碼輸入提示,是比較傳統的,類似於ssh登入的提示資訊:“請輸入密碼”(中文Linux)
需要注意的是,如果有多個使用者,最好是指定使用者ID,如上面的9A384DA1
gpg -u USERID --sign $fileName
可以指定在哪個金鑰進行簽名,因為--gen-key可以生產很多金鑰

3. expect指令碼實現簽名sign
下面是簽名的expect指令碼實現,針對gpg2.0.14密碼輸入提示Passphrase
該指令碼在linux上直接執行時可以成功進行簽名的, 簽名檔案成功後的檔案與fileName同一個目錄,名字後面加gpg, product.zip.gpg
expect-gpg.sh
======
#!/usr/bin/expect
set timeout 100
fileName=product.zip
cd /home/tmp/
spawn gpg -u 9A384DA1 --sign $fileName
expect "*assphrase"
send "12345678\r"
interact
=======

4.在Jenkins上呼叫expect.sh
在前面密碼互動的地方,總是報錯:
can't connect to `/root/.gnupg/S.gpg-agent': 沒有那個檔案或目錄
gpg-agent[12026]: command get_passphrase failed: End of file

在網上查了很多資料,沒有找到解決方案,最後想到在gen-key時,不輸入密碼,直接回車。
雖然給出提示,說不安全,但是公私鑰還是產生了,然後用這個使用者ID對檔案進行簽名,就不需要輸入密碼了,也不需要expect互動指令碼了
gpg -u 9A384DA9 --sign $fileName

5.gpg1.4.10版本
1.4.10版本sign的提示輸入密碼的提示與2.0.14不同,
此版本,用Jenkins網頁上呼叫expect指令碼,實現gpg --sign可以成功執行


GPG介紹及gen-key命令:
http://www.ruanyifeng.com/blog/2013/07/gpg.html