PHP不能直接读取Secure Boot状态,因其运行在用户态且无权限访问UEFI固件;Linux下可读取/sys/firmware/efi/secure_boot文件间接判断,Windows下基本不可靠。

PHP 能不能直接读取 Secure Boot 状态
不能。PHP 是运行在用户态的解释器,没有权限直接访问 UEFI 固件寄存器或 efivars,也没有内置函数(如 php_uname()、sys_getloadavg())能返回 Secure Boot 开关状态。
Linux 下通过系统接口间接判断 Secure Boot
实际可行路径是让 PHP 执行 shell 命令读取内核暴露的状态。主流发行版(如 Ubuntu、RHEL、Debian)在启用 Secure Boot 时,会在 /sys/firmware/efi/efivars/ 创建特定变量,并提供 /sys/firmware/efi/secure_boot 这个只读文件(值为 1 或 0)。
实操建议:
- 优先检查
/sys/firmware/efi/secure_boot:它最轻量、无需 root 权限,且被 systemd 和内核稳定支持 - 备选方案是调用
bootctl status(systemd-boot 环境)或解析mokutil --sb-state输出,但依赖额外工具和权限 - 避免读取
/sys/firmware/efi/efivars/目录内容——PHP 的scandir()在该路径下常因权限或挂载选项失败,且变量名不固定(如SetupMode-8be4df61-93ca-11d2-aa0d-00e098032b8c) - 注意 SELinux 或 AppArmor 可能拦截 PHP 进程对
/sys的读取,需确认 web 服务器上下文允许访问sysfs
示例代码片段:
立即学习“PHP免费学习笔记(深入)”;
if (file_exists('/sys/firmware/efi/secure_boot')) {
$state = (int) file_get_contents('/sys/firmware/efi/secure_boot');
// $state === 1 表示 Secure Boot 已启用
}
Windows 下 PHP 几乎无法检测 Secure Boot
Windows 不向用户态进程暴露 Secure Boot 状态的通用 API。PowerShell 有 Confirm-SecureBootUEFI,但 PHP 调用 shell_exec('powershell -Command "Confirm-SecureBootUEFI"') 会受限于 IIS/Apache 的服务账户权限、执行策略(ExecutionPolicy)和 PowerShell 版本兼容性。
常见错误现象:
- 返回空字符串或报错
The term 'Confirm-SecureBootUEFI' is not recognized(PowerShell Core 不支持该 cmdlet) - 在非交互式服务上下文中执行失败,即使手动运行 PowerShell 成功
-
Get-CimInstance -ClassName Win32_Firmware不包含 Secure Boot 字段,仅提供 BIOS 模式信息
结论:在 Windows 服务器环境,PHP 层面基本不可靠;如强需,应由部署脚本或安装程序在启动阶段检测并写入配置文件供 PHP 读取。
为什么不能依赖 openssl_sign() 或证书验证反推
有人试图用“能否验证微软签名的驱动”来间接判断 Secure Boot,这是误区。Secure Boot 影响的是内核加载阶段的签名验证,与 PHP 的 OpenSSL 扩展无关——openssl_sign()、openssl_verify() 只操作内存中的密钥和数据,不接触固件策略。
容易踩的坑:
- 混淆 UEFI Secure Boot 和 TLS/HTTPS 的证书链验证,二者完全独立
- 误以为
openssl_get_cert_locations()返回的 CA 路径能反映启动安全状态(它只反映 OpenSSL 编译时指定的默认信任库) - 在容器中运行时,即使宿主机启用了 Secure Boot,容器内 /sys/firmware/efi/ 通常不可见或为空,检测结果为假阴性
真正影响 PHP 应用的,是 Secure Boot 对内核模块、kdump、某些硬件驱动的限制,而非 PHP 自身行为——这点常被过度解读。
Secure Boot 是一个全栈链路状态,PHP 处在应用层末端,能做的只有读取操作系统提供的有限反射接口;任何绕过 sysfs 或 PowerShell 的尝试,要么失效,要么引入不可维护的 hack。



















