GitLab 9.5.0增加了對檢查提交的GPG簽名和旁邊顯示提交哈希(release note)驗證狀態。但是,該版本不驗證使用子密鑰簽名的提交(gitlab issue,計劃支持)。如何將GPG子項添加到GitLab
是否有可能在子項導出GPG並將它們轉換成主鍵,以便這些主鍵可以添加到GitLab?
GitLab 9.5.0增加了對檢查提交的GPG簽名和旁邊顯示提交哈希(release note)驗證狀態。但是,該版本不驗證使用子密鑰簽名的提交(gitlab issue,計劃支持)。如何將GPG子項添加到GitLab
是否有可能在子項導出GPG並將它們轉換成主鍵,以便這些主鍵可以添加到GitLab?
從版本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_subkey
和sec*.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_subkey
和sec000004-007.secret_subkey
)轉換成主鍵的數據包。爲了做到這一點,你需要一個十六進制編輯器(vim -b
就足夠了)並修改每個文件的第一個字節。取代公共子項與\x99
第一個字節,並祕密子項與\x95
第一個字節。如果您有vim -b
工作,你可以第一個字節從主密鑰文件pub000001-006.public_key
和sec000001-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。
[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,它使用類似的工具來解決不同的問題啓發。
如此漫長而先進的教學實際上還有效。非常感謝你。 :) 對於獲取正確子項的步驟,我們可以檢查密鑰創建時間。 和'vim -b'這裏是一個有用的命令,新手可能需要':%!xxd'和':%!xxd -r' – spicydog