如何向GitLab添加gpg子密钥

4
GitLab 9.5.0新增了对提交的gpg签名进行检查并在提交哈希值旁显示验证状态的支持(发布说明)。然而,这个版本不会验证使用子密钥签名的提交(gitlab问题, 支持正在计划中)。
是否有可能将gpg中的子密钥导出并转换为主密钥,以便将这些主密钥添加到GitLab中?
1个回答

4

编辑于2017年10月

自GitLab 10.1版本起,已原生支持子密钥。您可以直接添加完整的公钥。如果您密钥的电子邮件地址在GitLab中已经得到验证,则使用子密钥签名的提交将显示为“已验证”。


原始答案

虽然原始密钥环不应改变,但我建议您首先备份所有公钥和私钥!这个解决方案是相当实验性的!

创建一个目录,例如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,该文档使用类似的工具解决了不同的问题。


1
如此冗长和先进的指令,但实际上却起作用了。非常感谢。 对于获取正确子键的步骤,我们可以检查键创建时间。 对于 vim -b,这里有一个新手可能需要的有用命令 :%!xxd:%!xxd -r - spicydog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接