如何将gpg子键添加到GitLab

如何将gpg子键添加到GitLab,gitlab,gnupg,Gitlab,Gnupg,GitLab 9.5.0增加了对检查提交的gpg签名的支持,并在提交哈希()旁边显示验证状态。但是,此版本不验证使用子键签署的提交(,计划支持) 是否可以在gpg中导出子键并将其转换为主键,以便将这些主键添加到GitLab?编辑2017年10月 由于版本10.1,GitLab对子键具有本机支持。您只需添加 完全公钥。如果您的密钥的电子邮件地址已在GitLab中验证,则使用子密钥签名的提交将显示为“已验证” 原始答案 虽然原始密钥环不应更改,但我建议您首先备份所有(公开和秘密)密钥环!这个解决方

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

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

编辑2017年10月 由于版本10.1,GitLab对子键具有本机支持。您只需添加 完全公钥。如果您的密钥的电子邮件地址已在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]
这两个命令创建两个文件,每个文件对应一个数据包。您可以使用
pgpdump
检查数据包。我们对匹配
pub*.public\u子键
sec*.secret\u子键
的文件感兴趣。检查其中一个文件会发现

frank@7777a258a48e:~/sub2primary$ pgpdump sec000004-007.secret_subkey 
Old: Secret Subkey Packet(tag 7)(517 bytes)
...
这确实是一个私钥。如果您有多个子密钥(例如,一个用于签名,一个用于加密),我不确定如何识别正确的子密钥。在本例中,带有
*000004-*
的数据包将包含用于签名的密钥。(如果有疑问,请选择一个,如果是错误的,请重新开始。)

编辑:
gpg2——列出数据包
显示有关数据包的更多信息,包括密钥id。这有助于选择正确的数据包

转换为主键 其次,我们需要将这些子密钥包(这里是
pub000004-014.public\u subkey
sec000004-007.secret\u subkey
)转换成主键包。为此,您需要一个十六进制编辑器(
vim-b
就足够了)并修改每个文件中的第一个字节。将公开子密钥的第一个字节替换为
\x99
,将秘密子密钥的第一个字节替换为
\x95
。如果使用
vim-b
,可以从主键文件
pub000001-006.public\u-key
sec000001-005.secret\u-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
将提示输入必要的信息。完成后,
保存
。这将添加用户id并自动签名

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

frank@7777a258a48e:~/sub2primary$ gpg2 --no-default-keyring --keyring tmp     --secret-keyring sec_tmp --armor --export
您不应将
tmp
钥匙圈或此改装钥匙用于任何其他用途!上传密钥后,您可以删除临时文件。使用常用子密钥签名的提交现在将在GitLab上显示为已验证

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


信用证:此解决方案的灵感来源于,它使用类似的工具来解决不同的问题。

如此长且高级的说明实际上仍然有效。非常感谢。:)对于获取正确子密钥的步骤,我们可以检查密钥创建时间。对于
vim-b
,这里有一个新手可能需要的有用命令
:%!xxd和
:%!xxd-r