如何将gpg子项添加到GitLab

时间:2017-08-30 16:13:49

标签: gitlab gnupg

GitLab 9.5.0增加了对检查提交的gpg签名的支持,并在提交哈希(release note)旁边显示验证状态。但是,此版本不验证使用子键签名的提交(gitlab issue,计划支持)。

是否可以将子键导出为gpg并将其转换为主键,以便将这些主键添加到GitLab中?

1 个答案:

答案 0 :(得分:3)

2017年10月编辑

从版本10.1开始,GitLab对子项具有本机支持。你可以简单地添加 完整的公钥。使用子键签名的提交显示为已经过验证'如果您的密钥的电子邮件地址已在GitLab中验证。

Orignal回答

虽然原始密钥环不应该更改,但我建议您先备份所有(公共和秘密)密钥环!这个解决方案颇具实验性!

创建一个目录,例如sub2primary,并更改为它,因为以下命令将创建相当多的临时文件,这可能会弄乱您的主目录。我将假设以下设置

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

在ubuntu 16.04上。

导出子键

首先,您需要导出密钥(公钥和私钥,主密钥和子密钥)并将其分解为单个数据包。

$ gpg2 --export frank@example.com | gpgsplit -vp pub
$ gpg2 --export-secret-keys frank@example.com | gpgsplit -vp sec

这两个命令会创建几个文件,每个文件对应一个数据包。您可以使用pgpdump检查数据包。我们对匹配pub*.public_subkeysec*.secret_subkey的文件感兴趣。检查其中一个文件显示

frank@7777a258a48e:~/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显示密钥现在是主要密钥

frank@7777a258a48e:/~/sub2primary$ pgpdump sec000004-007.secret_subkey 
Old: Secret Key Packet(tag 5)(517 bytes)
...

导入主键

接下来,我们需要欺骗gpg来导入这些损坏的数据包(他们没有用户ID,也没有自签名)。要做到这一点,只需复制它们,使它们可以用作密钥环

frank@7777a258a48e:~/sub2primary$ cp pub000004-014.public_subkey ~/.gnupg/tmp
frank@7777a258a48e:~/sub2primary$ cp sec000004-007.secret_subkey ~/.gnupg/sec_tmp 

如下一次打印输出所示,可以告诉gpg使用这些修改后的密钥。

frank@7777a258a48e:~/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]

frank@7777a258a48e:~/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。

frank@7777a258a48e:~/sub2primary$ gpg2 --no-default-keyring --keyring tmp     --secret-keyring sec_tmp --edit-key 320752EA

子命令adduid将提示必要的信息。完成后,save。这会添加用户ID并自动对其进行签名。

导出子/主键

最后,您可以导出新的主键,该主键与旧的子键相同。输出可以添加到GitLab上的配置文件中。

frank@7777a258a48e:~/sub2primary$ gpg2 --no-default-keyring --keyring tmp     --secret-keyring sec_tmp --armor --export

您不应将tmp密钥环或此装配密钥用于任何其他目的!上传密钥后,您可以删除临时文件。使用您通常的子密钥签署的提交现在将在GitLab上显示为已验证

信用:此解决方案的灵感来自http://atom.smasher.org/gpg/gpg-migrate.txt,它使用类似的工具来解决不同的问题。