2017-08-30 39 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