GitLab 9.5.0增加了对检查提交的GPG签名和旁边显示提交哈希(release note)验证状态。但是,该版本不验证使用子密钥签名的提交(gitlab issue,计划支持)。如何将GPG子项添加到GitLab
是否有可能在子项导出GPG并将它们转换成主键,以便这些主键可以添加到GitLab?
GitLab 9.5.0增加了对检查提交的GPG签名和旁边显示提交哈希(release note)验证状态。但是,该版本不验证使用子密钥签名的提交(gitlab issue,计划支持)。如何将GPG子项添加到GitLab
是否有可能在子项导出GPG并将它们转换成主键,以便这些主键可以添加到GitLab?
从版本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_subkey
和sec*.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_subkey
和sec000004-007.secret_subkey
)转换成主键的数据包。为了做到这一点,你需要一个十六进制编辑器(vim -b
就足够了)并修改每个文件的第一个字节。取代公共子项与\x99
第一个字节,并秘密子项与\x95
第一个字节。如果您有vim -b
工作,你可以第一个字节从主密钥文件pub000001-006.public_key
和sec000001-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。
[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,它使用类似的工具来解决不同的问题启发。
如此漫长而先进的教学实际上还有效。非常感谢你。 :) 对于获取正确子项的步骤,我们可以检查密钥创建时间。 和'vim -b'这里是一个有用的命令,新手可能需要':%!xxd'和':%!xxd -r' – spicydog