无忧启动论坛

 找回密码
 注册
搜索
最纯净的「微PE装机优盘」UEPON大师作品系统gho:最纯净好用系统下载站数据恢复、数据保护、视频编辑
Win To Go 极致利器(IXUNCIS固态U盘)无忧启动网成立20周年!广告联系 QQ:184822951 微信:wuyouceo
查看: 1269|回复: 6

[教程] win 下对 grub2 的 efi 文件进行签名

  [复制链接]
发表于 2021-3-21 20:19:27 | 显示全部楼层 |阅读模式
本帖最后由 在树上酣睡 于 2021-3-21 20:18 编辑

1、证书制作
    使用 OpenSSL 软件来制作签名用的证书,以下证书相关都是基于这个软件来制作。

    (1)下载  OpenSSL 软件。
         OpenSSL 官方没有提供编译好的程序,只提供源码,用第三方编译好的 OpenSSL 软件,软件下载网址:http://wiki.overbyte.eu/wiki/index.php/ICS_Download
          1.png
        也可以使用 Linux 来制作证书,常见 Linux 基本都自带 OpenSSL  软件。

        OpenSSL 制作证书时需要一个配置文件,官方源码包里有配置文件,直接提取对应版本的源码包里的配置文件来使用,配置文件路径:apps/openssl.cnf 。源码下载网址:https://github.com/openssl/openssl/releases
         2.png

    (2)根证书制作
        1)新建根证书目录,用于存放根证书的相关文件。
  1. mkdir root_ca
  2. mkdir root_ca\certs
  3. mkdir root_ca\private
复制代码
           其中,root_ca\certs          用于存放根证书文件。
                     root_ca\private        用于存放私钥文件。

        2)生成根证书私钥
  1. openssl genrsa -out root_ca/private/root_ca.key 4096
复制代码
            3.png
            其中,genrsa              使用RSA算法产生私钥
                     -aes256             使用256位密钥的AES算法对私钥进行加密
                     -nodes               不加密输出的密钥
                     -passout            如果输出文件需要被对称加密,需要指定输出文件的密码,比如:-passout pass:1234
                              pass:123456       设置普通密码
                             file:passwd.txt     从文件读取密码
                             env:passwd         从控制台变量中读取密码
                             fd:1                    从文件描述符中读取密码,文件描述符必须打开
                             stdin                   从标准输入读取密码
                      -out                  输出文件的路径
                      4096                 指定私钥长度

        3)生成根证书签发申请文件(csr文件)
            使用上一步生成的私钥(pem文件),生成证书请求文件(csr文件):
  1. openssl req -new -key root_ca/private/root_ca.key -out root_ca/private/root_ca.csr -config openssl.cnf -subj "/C=CN/ST=ShanXi/L=XiAn/O=xxx/CN=xxx"
复制代码
         4.png
         其中,req            执行证书签发命令
                  -new         新证书签发请求
                  -key          指定私钥路径
                  -out          出的csr文件的路径
                  -config      指定配置文件
                  -subj         证书相关的用户信息(subject的缩写)
        用户信息:
                  C:Country ,单位所在国家,为两位数的国家缩写,如: CN 就是中国
                  ST:State/Province ,单位所在州或省
                   L:Locality ,单位所在城市 / 或县区
                  O:Organization ,网站的单位名称
                  OU:Organization Unit,部门名称,也常常用于显示其他证书相关信息,如证书类型,证书产品名称或身份验证类型或验证内容等
                  CN:Common Name ,名称,如果用于 SSL 则可以写网站的域名;
                  emailAddress:Email Address ,邮箱地址

        4)自签发根证书(cer文件)
            根证书签发申请文件(csr文件)生成以后,可以将其发送给CA认证机构进行签发,当然,这里使用根证书私钥对该证书进行自签发。
  1. openssl x509 -req -days 36500 -sha256 -extfile openssl.cnf -extensions v3_ca -signkey root_ca/private/root_ca.key -in root_ca/private/root_ca.csr -out root_ca/certs/root_ca.cer
复制代码
            5.png
            其中, x509                 生成x509格式证书
                      -req                  表示输入的文件为证书签发申请文件
                      -days                证书的有效期(天)
                      -sha256            证书摘要采用sha256算法
                      -extfile              指定OpenSSL配置文件
                      -extensions        这里指定的-extensions的值为v3_ca,v3_ca中指定的basicConstraints的值为CA:TRUE,表示该证书是颁发给CA机构的证书
                      -signkey            签发证书的私钥
                      -in                    要输入的csr文件路径
                      -out                  输出的cer证书文件
                      -extfile              证书包括X509 v3的extension属性值

    (3)用于安全启动的证书制作
        1)新建存放安全启动证书和密钥目录。
  1. mkdir secure_boot_ca
  2. mkdir secure_boot_ca\certs
  3. mkdir secure_boot_ca\private
复制代码

        2)生成用于安全启动的私钥。
  1. openssl genrsa -out secure_boot_ca/private/secure_boot_ca.key 2048
复制代码
        
       3)生成证书签发申请文件。
  1. openssl req -new -key secure_boot_ca/private/secure_boot_ca.key -out secure_boot_ca/private/secure_boot_ca.csr -config openssl.cnf -subj "/C=CN/ST=ShanXi/L=XiAn/O=xxx/OU=grub2/CN=secure boot"               
复制代码
       6.png

        4)使用上一步生成的根证书来签发安全启动证书。
  1. openssl x509 -req -days 36500 -sha256 -extfile openssl.cnf -extensions v3_req -CA root_ca/certs/root_ca.cer -CAkey root_ca/private/root_ca.key -CAcreateserial -in secure_boot_ca/private/secure_boot_ca.csr -out secure_boot_ca/certs/secure_boot_ca.cer         
复制代码
       7.png
        其中,-extfile               指定OpenSSL配置文件
                 -extensions         这里指定的-extensions的值为v3_req,在OpenSSL的配置中,v3_req配置的basicConstraints的值为CA:FALSE,表示该证书不是 CA 证书,不能签发其他证书。而前面生成根证书时,使用的-extensions值为v3_ca,v3_ca中指定的basicConstraints的值为CA:TRUE,表示该证书是颁发给CA机构的证书,可以用来签发其发证书。
                 -CA                    指定CA证书的路径
                 -CAkey               指定CA证书的私钥路径
                 -CAcreateserial    表示创建证书序列号文件,创建的序列号文件默认名称为-CA,指定的证书名称后加上.srl后缀。

        5)将 pem (默认)格式的证书转换为 der 格式。 mmx64.efi 导入的证书就是这个证书。
  1. openssl x509 -in secure_boot_ca/certs/secure_boot_ca.cer -outform der -out secure_boot_ca/certs/secure_boot_signer.der
复制代码
       9.png

2、efi 单文件制作。        
    grub2 下载网址:https://ftp.gnu.org/gnu/grub/
    制作命令:
  1. grub-mkimage.exe -m grub2.tar -o grubx64.efi -O x86_64-efi part_gpt part_msdos memdisk tar fat  normal search
复制代码
    11.png
    其中,part_gpt part_msdos   模块可以识别 gpt 和 mbr 类型的硬盘。
              memdisk                   识别嵌入的 memdisk 映像

              fat                            模块可以访问 fat 格式的分区

              tar                            模块可以访问归档包
              normal                      加载 normal 模块后将进入“普通模式”,否则将进入救援模式。在救援模式中,GRUB只自动设置了"cmdpath prefix root"三个环境变量,并且只能使用"insmod ls set unset"四个和已加载模块所带的命令。
             search                       搜索命令
             -m                            表示在 efi 文件中嵌入 memdisk 映像,这里嵌入 tar 归档包。grub2 在加载 memdisk 模块后,会将嵌入的 memdisk 映像识别为 (memdisk) 设备,类似于 (hd) 设备。然后加载 tar 模块后会识别其中的文件。
                                             指定 -m 参数后,grub 会自动设定  -p (memdisk)/boot/grub ,即 set prefix=(memdisk)/boot/grub 。
             -o                             输出的 efi 文件名

             -O                            制作 grub2 的模式
         grub2.tar 文件结构:

         grub2.tar
             |--- boot
                     |--- grub
                             |----- grub.cfg

         使用 7-Zip 软件打包 boot 文件夹可得到 grub2.tar 。
         10.png

3、使用证书给得到的 grubx64.efi 签名。
    (1)在 Linux 系统中可以使用 sbsign 工具签名,比较方便。ubuntu 自带 sbsign 工具。
  1. sbsign --cert secure_boot_ca/certs/secure_boot_ca.cer --key secure_boot_ca/private/secure_boot_ca.key --output grubx64.efi grubx64.efi
复制代码
       14.png
        其中,--cert        证书路径
                 --key         密钥路径
                --output     签名后的文件输出路径

    (2)在 win 下有一个叫 jsign 的 java 软件可以对二进制文件进行签名。
        Java 环境下载网址:https://www.oracle.com/java/tech ... jdk8-downloads.html

        jsign 下载网址:https://github.com/ebourg/jsign/releases

        jsign 对证书和密钥的格式有要求,需要用 OpenSSL 转换证书和密钥的格式。
        转换密钥的命令为:
  1. openssl rsa -in secure_boot_ca/private/secure_boot_ca.key -outform PVK -pvk-strong -out secure_boot_ca/private/secure_boot_ca.pvk
复制代码

        转换证书时需要输入密码,密码必须4位以上,不然签名时会报错。转换证书的命令为:
  1. openssl crl2pkcs7 -nocrl -certfile secure_boot_ca/certs/secure_boot_ca.cer -outform DER -out secure_boot_ca/certs/secure_boot_ca.spc
复制代码
       12.png

        关于  .key .csr .cer .der .pvk .spc ,这些文件分为 私钥 和 证书 两部分。
        .key 为私钥文件。
        .cer 和 .der 都为证书文件,只是内容的编码方式不同。.cer 文件是将证书内容以 Base64 的方式存在文件中。而 .der 是将内容以二进制的形式存在文件里。
        .pvk 为 win 能识别的密钥文件格式。
        .spc 为 PKCS#7 证书 。
        .csr 为证书签发申请文件。

        对 efi 文件进行签名:
  1. java -jar jsign-3.1.jar --certfile secure_boot_ca\certs\secure_boot_ca.spc --keyfile secure_boot_ca\private\secure_boot_ca.pvk --keypass xxxx grubx64.efi
复制代码
         13.png
         其中,--certfile      为 PKCS#7 格式的证书。
                  --keyfile       为 .pvk 格式的密钥。
                  --keypass     为 PKCS#7 格式证书的密码。

4、导入证书  

    导入证书可以按下边的教程来进行:

    https://www.ventoy.net/cn/doc_secure.html

5、安全启动过程
        安全启动会使用到三个 efi 文件,其中 bootx64.efi 和 mmx64.efi 文件提取于最新版的 ubuntu 镜像,grubx64.efi 文件为上一步签名的 efi 文件。
    启动时,bios 会首先引导  bootx64.efi 文件,bootx64.efi 程序运行起来后会检验 grubx64.efi 签名,如果签名校验通过,侧引导同目录下的 grubx64.efi 文件。
    如果 grubx64.efi 校验不通过,则引导 mmx64.efi 文件,mmx64.efi 文件的作用就是导入证书或者 efi 文件的 hash 值。
         15.png
        mmx64.efi 、MokManager.efi 、shim.efi 作用都基本相同,只是提取自不同的 Linux 版本。
         16.png
最近想做一个双启动的引导,查了许多资料,知识点都比较凌乱,所以就整理了一下。如果有错误的地方希望大家能指出来。



评分

参与人数 1无忧币 +5 收起 理由
蓝星明月 + 5 赞一个!

查看全部评分

发表于 2021-3-21 21:35:58 | 显示全部楼层
能对grubx64.efi文件进行签名,是否意味着W大修改的grub2能够顺利安全启动了?

点评

理论上应该可以,不过好像只有部分主板支持导入证书,具体到某台电脑,还是需要测试的。  详情 回复 发表于 2021-3-26 22:34
回复

使用道具 举报

发表于 2021-3-21 22:09:14 | 显示全部楼层
本帖最后由 mrzhonghb 于 2021-3-21 22:27 编辑

http://bbs.wuyou.net/forum.php?mod=viewthread&tid=413597
原帖在这里,我启动U盘上的grub2和grub2fm一直都可以过安全启动,直接用现成文件就行。
Snipaste_2021-03-21_22-12-40.png

securebootloader.part1.rar

400 KB, 下载次数: 32, 下载积分: 无忧币 -2

securebootloader.part2.rar

230.85 KB, 下载次数: 27, 下载积分: 无忧币 -2

回复

使用道具 举报

发表于 2021-3-22 09:40:14 | 显示全部楼层
感谢分享,目前还是直接关安全启动
回复

使用道具 举报

 楼主| 发表于 2021-3-26 22:34:43 | 显示全部楼层
lusir401 发表于 2021-3-21 21:35
能对grubx64.efi文件进行签名,是否意味着W大修改的grub2能够顺利安全启动了?

理论上应该可以,不过好像只有部分主板支持导入证书,具体到某台电脑,还是需要测试的。
回复

使用道具 举报

发表于 2021-4-2 13:41:50 | 显示全部楼层
谢谢分享!!! 谢谢分享!!! 谢谢分享!!!
回复

使用道具 举报

发表于 2021-4-5 00:32:38 | 显示全部楼层
硬核操作
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2021-4-22 11:41

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表