GitLab 9.5.0增加了对检查提交的gpg签名的支持,并在提交哈希(release note)旁边显示验证状态。但是,此版本不验证使用子键签名的提交(gitlab issue,计划支持)。
是否可以将子键导出为gpg并将其转换为主键,以便将这些主键添加到GitLab中?
答案 0 :(得分:3)
从版本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]
在ubuntu 16.04上。
首先,您需要导出密钥(公钥和私钥,主密钥和子密钥)并将其分解为单个数据包。
$ gpg2 --export frank@example.com | gpgsplit -vp pub
$ gpg2 --export-secret-keys frank@example.com | gpgsplit -vp sec
这两个命令会创建几个文件,每个文件对应一个数据包。您可以使用pgpdump
检查数据包。我们对匹配pub*.public_subkey
和sec*.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_subkey
和sec000004-007.secret_subkey
)转换为主密钥数据包。为此,您需要一个十六进制编辑器(vim -b
就足够了)并修改每个文件中的第一个字节。将公共子项的第一个字节替换为\x99
,将秘密子项的第一个字节替换为\x95
。如果您使用vim -b
,则可以复制主键文件pub000001-006.public_key
和sec000001-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。
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,它使用类似的工具来解决不同的问题。