2017-08-30 41 views
1

GitLab 9.5.0增加了對檢查提交的GPG簽名和旁邊顯示提交哈希(release note)驗證狀態。但是,該版本不驗證使用子密鑰簽名的提交(gitlab issue,計劃支持)。如何將GPG子項添加到GitLab

是否有可能在子項導出GPG並將它們轉換成主鍵,以便這些主鍵可以添加到GitLab?

回答

2

編輯2017年10月

從版本10.1開始,GitLab對子鍵有本地支持。您可以簡單地添加完整的公鑰 。如果您的密鑰的電子郵件地址已在GitLab中驗證過,則使用子密鑰簽名的提交將顯示爲「已驗證」。


一部開拓創新的答案

雖然最初的鑰匙圈不應該改變,我建議你備份你所有的(公開的祕密)鑰匙扣第一!這個解決方案相當實驗!

創建一個目錄,例如sub2primary,並進行更改,因爲以下命令將創建相當多的臨時文件,這可能會破壞您的主目錄。我將假設以下設置

[email protected]:~/sub2primary$ gpg2 --list-keys 
/home/frank/.gnupg/pubring.kbx 
------------------------------ 
pub rsa1024/34171358 2017-08-30 [SC] 
uid   [ultimate] Frank <[email protected]> 
sub rsa1024/320752EA 2017-08-30 [S] 
sub rsa1024/BBA338AD 2017-08-30 [E] 

在Ubuntu 16.04上。

出口子項

首先,你需要導出密鑰(公鑰和私鑰,小學和子項),並將其分解成單個數據包。

$ gpg2 --export [email protected] | gpgsplit -vp pub 
$ gpg2 --export-secret-keys [email protected] | gpgsplit -vp sec 

這兩個命令創建了幾個文件,每個文件對應一個包。您可以使用pgpdump檢查數據包。我們對匹配pub*.public_subkeysec*.secret_subkey的文件感興趣。檢查其中一個文件顯示

[email protected]:~/sub2primary$ pgpdump sec000004-007.secret_subkey 
Old: Secret Subkey Packet(tag 7)(517 bytes) 
... 

這確實是一個私有子項。如果你有多個子鍵(例如一個用於簽名和一個用於加密),我不確定,如何識別,是正確的。在這個例子中,包含*000004-*的數據包將包含用於簽名的密鑰。 (有疑問選擇一個,如果是錯誤的則重新開始。)

編輯:gpg2 --list-packets <file>顯示關於包括密鑰ID的數據包的更多信息。這有助於選擇正確的數據包。

轉換爲主鍵

其次,我們需要將這些子項的數據包(這裏pub000004-014.public_subkeysec000004-007.secret_subkey)轉換成主鍵的數據包。爲了做到這一點,你需要一個十六進制編輯器(vim -b就足夠了)並修改每個文件的第一個字節。取代公共子項與\x99第一個字節,並祕密子項與\x95第一個字節。如果您有vim -b工作,你可以第一個字節從主密鑰文件pub000001-006.public_keysec000001-005.secret_key複製。 (不要混合公開和祕密!)

此過程pgpdump後顯示按鍵現在第一性的

[email protected]:/~/sub2primary$ pgpdump sec000004-007.secret_subkey 
Old: Secret Key Packet(tag 5)(517 bytes) 
... 

導入主鍵

接下來,我們需要欺騙gpg導入這些破包(它們沒有用戶ID,也不是自簽名)。要做到這一點,簡單地複製它們,這樣它們可以作爲鑰匙扣

[email protected]:~/sub2primary$ cp pub000004-014.public_subkey ~/.gnupg/tmp 
[email protected]:~/sub2primary$ cp sec000004-007.secret_subkey ~/.gnupg/sec_tmp 

由於在接下來的打印輸出上顯示,它可以告訴gpg使用這些修改後的密鑰。

[email protected]:~/sub2primary$ gpg2 --no-default-keyring --keyring tmp --secret-keyring sec_tmp --list-secret-keys 
/home/frank/.gnupg/tmp 
---------------- 
sec rsa1024/320752EA 2017-08-30 [SCEA] 

[email protected]:~/sub2primary$ gpg2 --no-default-keyring --keyring tmp  --secret-keyring sec_tmp --list-keys 
/home/frank/.gnupg/tmp 
---------------- 
pub rsa1024/320752EA 2017-08-30 [SCEA] 

添加用戶ID

最後一步包括編輯這個鍵添加一個用戶ID。

[email protected]:~/sub2primary$ gpg2 --no-default-keyring --keyring tmp  --secret-keyring sec_tmp --edit-key 320752EA 

子命令adduid將提示輸入必要的信息。一旦完成,save。這會添加用戶標識並自動對其進行簽名。

出口子/主鍵

最後,您可以導出新的主鍵,這等同於你的舊子項。可以將輸出添加到GitLab上的配置文件中。

[email protected]:~/sub2primary$ gpg2 --no-default-keyring --keyring tmp  --secret-keyring sec_tmp --armor --export 

您不應該使用tmp鑰匙環或此操作鑰匙用於任何其他目的!一旦你上傳了密鑰,你就可以刪除臨時文件。使用通常的子密鑰簽名的提交現在將在GitLab上顯示爲已驗證


信用:該解決方案通過http://atom.smasher.org/gpg/gpg-migrate.txt,它使用類似的工具來解決不同的問題啓發。

+1

如此漫長而先進的教學實際上還有效。非常感謝你。 :) 對於獲取正確子項的步驟,我們可以檢查密鑰創建時間。 和'vim -b'這裏是一個有用的命令,新手可能需要':%!xxd'和':%!xxd -r' – spicydog