解决无法导入GPG公钥问题
解决无法导入GPG公钥问题

解决无法导入GPG公钥问题

场景复现

在学习gpg公钥时,发现自身客户端生成的gpg公钥导入虚拟机CentOS和服务器CentOS都会报下面的错误:

[root@fangjunyu]/var/tmp# gpg --import public.key
gpg: 密钥 5C6022E4:没有有效的用户标识
gpg: 这可能由于遗失自身签名所致
gpg: 合计被处理的数量:1
gpg:     遗失用户标识:

从网络上没有搜索到类似的问题,然后自行排查发现造成的原因是,CentOS系统自带的gpg版本低,导致CentOS系统的gpg不兼容MacOS生成的gpg公钥。

( 虚拟机的gpg版本2.0.22 )

( 客户端的gpg版本 2.4.4 )

从上图中不难看出,macOS生成的公钥算法为 ed25519,属于Ed25519 类型的公钥。Ed25519 是一种基于椭圆曲线的数字签名算法,提供了高安全性和性能。它是在 EdDSA(Edwards-curve Digital Signature Algorithm)基础上设计的,使用了 Curve25519 曲线作为其基础。Ed25519 公钥用于生成数字签名,通常用于身份验证和数据完整性验证。

因此,我们需要升级gpg版本来解决这个问题。

配置环境

1)客户端:macOS Monterey 12.7.3

2)虚拟机: CentOS Linux release 7.9.2009 (Core)(有可视化界面)

3)服务器:CentOS Linux release 7.9.2009 (Core)(无可视化界面)

升级方法

GnuPG下载地址https://www.gnupg.org/download/index.html

GnuPG软件包下载地址

GnuPG 有两种类型的发布版本:二进制发布版本和源代码发布版本。

1、二进制发布版本:

二进制发布版本是已经编译和打包好的程序,可以直接在的操作系统上运行。

这些版本通常适用于最常见的操作系统,如Windows、macOS和各种Linux发行版。

2、源代码发布版本:

源代码发布版本是 GnuPG 的原始代码,用户需要自行编译和构建可执行程序。

这些版本通常适用于需要在不同的操作系统或环境中进行定制或修改的用户和开发者。

1、使用二进制发布版本升级

前提条件:虚拟机的CentOS具有可视化界面,因此使用二进制发布版本,如果你的CentOS没有可视化界面,那么建议安装源代码发布版本,否则会要求安装一系列的软件包,这里不做“无可视化界面安装二进制发布版本”的讨论。

首先,在虚拟机的的 /opt 文件夹下,创建一个 /gpg 文件夹

make /opt/gpg && cd /opt/gpg

然后,我们访问gpg官网并下载最新的二进制发布版本(GnuPG binary releases)

wget –-no-check-certificate https://download.gnupg.com/files/gnupg/gnupg-desktop-2.4.3.0-x86_64.AppImage

注意:可能会遇到“gnupg-desktop-2.4.3.0-x86_64.AppImage: 权限不够”的问题,这时需要使用 su 命令切换到root用户进行下载,另外 –no-check-certificate是告诉wget不要对SSL证书进行验证,这在某些情况下可以避免由于证书问题导致的下载失败。

因为下载的 gnupg-desktop-2.4.3.0-x86_64.AppImage 没有执行权限,我们赋一个权限:

chmod +x gnupg-desktop-2.4.3.0-x86_64.AppImage

注意:如果用root用户运行,就会报下述错误,这个错误是出于安全考虑的一种措施,不建议以root权限运行GUI应用程序。

[root@localhost gpg]# ./gnupg-desktop-2.4.3.0-x86_64.AppImage
error: the GUI may not be run by root

我们需要切换到普通用户运行gnupg-desktop:

[root@localhost gpg]# su fangjunyu
[fangjunyu@localhost gpg]$ ./gnupg-desktop-2.4.3.0-x86_64.AppImage 
gpg-agent[113003]: trying to steal socket from running gpg-agent
gpg-agent[113005]: gpg-agent (GnuPG) 2.4.3 started
kf.config.core: Use of KConfigWatcher without DBus support. You will not receive updates

然后,就会运行Kleopatra,这是GPG的前端展示应用,我们可以通过这个应用导入前面导入报错的GPG公钥。

关于Mac生成的GPG公钥导入CentOS报错的问题就解决了。

2、源代码发布版本

这里我是用的是无可视化界面的服务器进行安装测试的。

我们还是要在服务器的 /opt 文件夹下,创建一个 /gpg 文件夹,在这个文件夹下安装相关的GPG依赖项。

make /opt/gpg && cd /opt/gpg

1)配置系统环境

sudo yum update:更新软件包列表。
sudo yum install bzip2:安装bzip2软件包。
sudo yum groupinstall "Development Tools":安装编译软件所需的工具和库。

2)安装GPG依赖项

(1)安装npth:https://gnupg.org/ftp/gcrypt/npth/

wget --no-check-certificate https://gnupg.org/ftp/gcrypt/npth/npth-1.7.tar.bz2 \
&& tar jxvf npth-1.7.tar.bz2 \
&& ./npth-1.7/configure && make && sudo make install

(2)安装libgpg-error:https://gnupg.org/ftp/gcrypt/gpgrt/

wget --no-check-certificate https://gnupg.org/ftp/gcrypt/gpgrt/libgpg-error-1.48.tar.bz2 \
&& tar jxvf libgpg-error-1.48.tar.bz2 \
&& ./libgpg-error-1.48/configure && make && sudo make install

(3)安装libgcrypt:https://gnupg.org/ftp/gcrypt/libgcrypt/

wget --no-check-certificate https://gnupg.org/ftp/gcrypt/libgcrypt/libgcrypt-1.10.3.tar.bz2 \
&& tar jxvf libgcrypt-1.10.3.tar.bz2 \
&& ./libgcrypt-1.10.3/configure && make && sudo make install

(4)安装libassuan:https://gnupg.org/ftp/gcrypt/libassuan/

wget --no-check-certificate https://gnupg.org/ftp/gcrypt/libassuan/libassuan-2.5.7.tar.bz2 \
&& tar jxvf libassuan-2.5.7.tar.bz2 \
&& ./libassuan-2.5.7/configure && make && sudo make install

(5)安装libksba:https://gnupg.org/ftp/gcrypt/libksba/

wget --no-check-certificate https://gnupg.org/ftp/gcrypt/libksba/libksba-1.6.6.tar.bz2 \
&& tar jxvf libksba-1.6.6.tar.bz2 \
&& ./libksba-1.6.6/configure && make && sudo make install

注意:这里最好按照这个顺序来安装GPG依赖项,因为本身依赖项也是具有其他的前提依赖,如果没有按照这个顺序按照,可能会导致缺失依赖项而报错。因为我在操作中遇到这个问题,但不清楚是否真的是顺序原因。因此在这里提一下。

全部安装完成后,这些依赖包都安装到了 /opt/gpg 目录下,同时也可以在 /usr/local/lib目录下查看。

ls /opt/gpg
ls /usr/local/lib

3)安装GPG

我们需要到GPG官网下载最新的GnuPG 软件包。

这时,我们还是在 /opt/gpg 目录下,执行

wget --no-check-certificate https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.4.5.tar.bz2

下载完成后,我们可以检验文件的哈希值,可从官网上查看文件对应的哈希值。

复制左侧版本对应的哈希值,并下面的命令才对哈希值进行校验:

[root@fangjunyu]/opt/gpg# sha256sum gnupg-2.4.5.tar.bz2 | grep f68f7d75d06cb1635c336d34d844af97436c3f64ea14bcb7c869782f96f44277

f68f7d75d06cb1635c336d34d844af97436c3f64ea14bcb7c869782f96f44277  gnupg-2.4.5.tar.bz2

输出内容,则表示下载的文件完整性检查通过。

然后,我们解压并安装 GPG:

tar jxvf gnupg-2.4.5.tar.bz2 \
&& ./gnupg-2.4.5/configure && make && sudo make install

这时,我们执行 gpg –version 发现是旧版本,而执行 /usr/local/bin/gpg 显示的不是新版本,而是一个报错。

[root@fangjunyu]/opt/gpg# /usr/local/bin/gpg --version
/usr/local/bin/gpg: error while loading shared libraries: libgcrypt.so.20: cannot open shared object file: No such file or directory

这个错误为,提示缺少“libgcrypt.so.20”文件,而我们实际上在安装GPG依赖项的第三步中已经安装了libgcrypt。

并且可以通过执行下面的代码查看

[root@fangjunyu]/opt/gpg# ls /usr/local/lib | grep libgcrypt
libgcrypt.la
libgcrypt.so
libgcrypt.so.20
libgcrypt.so.20.4.3

那么,如何解决呢?

接下来,神之一笔

sudo echo "/usr/local/lib" >> /etc/ld.so.conf \
&& sudo ldconfig

只需要将 /usr/local/bin 添加到动态链接库并运行 ldconfig 命令来更新动态链接库缓存即可。

注意:在修改配置文件时,一定要备份,以免造成修改错误,配置文件不能用的问题!!!

然后,我们在执行下面的命令:

echo "alias gpg=/usr/local/bin/gpg" >> ~/.bash_aliases \
&& source ~/.bash_aliases  \
&& gpg --version # 激活别名并显示gpg版本号

升级gpg完成后,就可以导入公钥了,问题成功解决。

完结撒花🎉🎉🎉

参考资料

1、How to upgrade to GnuPG >2.2.8? :https://askubuntu.com/questions/1242572/how-to-upgrade-to-gnupg-2-2-8

2、GnuPG官网:https://www.gnupg.org/download/index.html

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注