如何使用 sign-file 签署内核模块?

如何使用 sign-file 签署内核模块?

我刚刚安装了带有安全启动的 Ubuntu 16.04,遇到了同样的问题vmware 错误如下所述:

modprobe: ERROR: could not insert 'vmnet': Required key not available

解决这个问题的一个方法是禁用安全启动,但我不想这么做。另一种方法是对内核模块进行签名我自己, 按照此非常详细的线程。有一个关于如何做到这一点的教程在 RHEL 中在 Fedora 中但是所有这些解决方案都依赖于一些我似乎找不到的脚本:

sudo /usr/src/kernels/$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vmmon)

sign-file在 Ubuntu 中哪里可以找到这个脚本?


有关的:https://github.com/bergwolf/rhel6/blob/master/Documentation/module-signing.txt内核编译后对模块进行签名

答案1

在 Ubuntu 上,那将是/usr/src/linux-headers-$(uname -r)/scripts/sign-file

我是怎么知道的?我搜索了一下sign-file

dpkg -S sign-file

它告诉我哪个包提供了这个文件(当前linux-headers-4.4.0-22-generic)以及它安装在哪里,即/usr/src/linux-headers-4.4.0-22-generic/scripts/

uname -r部分只是为了保持命令独立于当前安装的 headers-generic 包。

答案2

从 VMware 的站点来看,导致您出现问题的原因可能是:

在启用了安全模式的 Linux 主机上,不允许加载任何未签名的驱动程序。因此,VMware 驱动程序(例如 vmmon 和 vmnet)无法加载,从而阻止虚拟机启动。

要在不关闭安全启动的情况下解决此问题,您可以在终端中执行以下操作:

  1. 使用 openssl 生成密钥对来签名 vmmon 和 vmnet 模块:

    ~$ openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj “/CN=VMware/”

    (将 MOK 替换为您想要的密钥文件的名称。)

  2. 通过运行以下命令,使用生成的密钥对模块进行签名:

    ~$ sudo /usr/src/linux-headers- uname -r/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vmmon)

    ~$ sudo /usr/src/linux-headers- uname -r/scripts/sign-file sha256 ./MOK.priv ./MOK.der $ (modinfo -n vmnet)

  3. 通过运行以下命令将公钥导入系统的 MOK 列表:

    ~$ sudo mokutil --import MOK.der

  4. 确认此 MOK 注册请求的密码。

  5. 重新启动计算机。按照说明从 UEFI 控制台完成注册。

引用自此 VMWare 文章:https://kb.vmware.com/kb/2146460

相关内容