如何使用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)

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


相关: https : //github.com/bergwolf/rhel6/blob/master/Documentation/module-signing.txt并在内核编译后签署一个模块 。

在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包。

从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