怎么用脚本获取操作系统数字签名

wen 实用脚本 4

本文目录导读:

怎么用脚本获取操作系统数字签名

  1. 场景一:获取系统核心文件的数字签名(最准确)
  2. 场景二:检查操作系统是否开启了“强制驱动程序签名”
  3. 场景三:获取操作系统二进制文件的全局签名状态(合规性)
  4. 场景四:跨平台获取操作系统数字证书(如 macOS/Linux)
  5. 完整建议流程
  6. 注意事项

获取操作系统数字签名(通常指系统文件的数字签名状态,例如内核文件 ntoskrnl.exe 的签名信息,或者系统是否为“已签名”状态)可以通过多种脚本实现。

以下分场景提供几种脚本方案:

获取系统核心文件的数字签名(最准确)

这可以查看系统的关键驱动程序是否被篡改或是否具备有效的数字签名。

方法1:PowerShell + Get-AuthenticodeSignature (适用于 Windows)

这个命令可以检查任何文件的数字签名信息。

# 获取系统核心文件 ntoskrnl.exe 的数字签名
$kernelPath = "$env:SystemRoot\System32\ntoskrnl.exe"
$signature = Get-AuthenticodeSignature -FilePath $kernelPath
# 输出签名信息
Write-Host "文件路径: $kernelPath"
Write-Host "签名状态: $($signature.Status)"  # Valid, NotSigned, Unknown, HashMismatch, NotTrusted
Write-Host "签名者: $($signature.SignerCertificate.Subject)"
Write-Host "时间戳: $($signature.TimeStamperCertificate.Subject)"

方法2:使用 sigcheck (Sysinternals 工具)

sigcheck 是微软官方工具,功能更强大,可以批量检查并输出机器可读格式。

下载并保存为 script.ps1:

# 下载 sigcheck (如未安装)
$url = "https://download.sysinternals.com/files/Sigcheck.zip"
$output = "$env:TEMP\sigcheck.zip"
Invoke-WebRequest -Uri $url -OutFile $output
Expand-Archive -Path $output -DestinationPath "$env:ProgramFiles\Sysinternals" -Force
# 检查系统目录下的所有 .sys 和 .exe 文件签名
$sigcheckPath = "$env:ProgramFiles\Sysinternals\sigcheck64.exe"
& $sigcheckPath -accepteula -nobanner -s $env:SystemRoot\System32\drivers\*.sys
# 仅输出关键文件签名摘要
& $sigcheckPath -accepteula -nobanner $env:SystemRoot\System32\ntoskrnl.exe

检查操作系统是否开启了“强制驱动程序签名”

这在 64 位 Windows(Vista 及之后)中很关键,决定了系统是否会加载未签名的内核驱动。

:: Windows 批处理脚本
@echo off
bcdedit /enum {current} | findstr /i "testsigning"
if %errorlevel% equ 0 (
    echo 当前处于:测试签名模式 (Test Signing Mode)
) else (
    echo 当前处于:正常强制签名模式 (Code Integrity Enforcement)
)
:: 检查安全启动状态(现代PC)
powershell -Command "Confirm-SecureBootUEFI"
if %errorlevel% equ 0 (
    echo 安全启动 (Secure Boot): 已启用
) else (
    echo 安全启动 (Secure Boot): 未启用或不可用
)

获取操作系统二进制文件的全局签名状态(合规性)

适用于批量审计系统文件是否被篡改或签名缺失。

# PowerShell 脚本:检查 %SystemRoot%\System32 下最关键的 50 个系统文件
$files = Get-ChildItem -Path "$env:SystemRoot\System32" -Include *.exe,*.dll,*.sys -Recurse -ErrorAction SilentlyContinue | Select-Object -First 50
$result = @()
foreach ($file in $files) {
    $sig = Get-AuthenticodeSignature -FilePath $file.FullName -ErrorAction SilentlyContinue
    $result += [PSCustomObject]@{
        FileName = $file.Name
        FullPath = $file.FullName
        Status   = $sig.Status
        Signer   = if ($sig.SignerCertificate) { $sig.SignerCertificate.Subject } else { "N/A" }
    }
}
# 输出到表格
$result | Format-Table -AutoSize
# 检查是否有未签名或签名损坏的文件
$unsignedFiles = $result | Where-Object { $_.Status -ne "Valid" -and $_.Status -ne "NotSigned" -and $_.Status -ne $null }
if ($unsignedFiles) {
    Write-Warning "发现 $($unsignedFiles.Count) 个签名异常文件!"
    $unsignedFiles | Format-Table -AutoSize
} else {
    Write-Host "所有检查的文件签名正常。" -ForegroundColor Green
}

跨平台获取操作系统数字证书(如 macOS/Linux)

不同的操作系统有不同的机制:

macOS (获取系统签名状态)

#!/bin/bash
# 检查 macOS 系统完整性保护 (SIP) 和内核签名
csrutil status
# 检查特定系统文件的签名
codesign -dv --verbose=4 /System/Library/Kernels/kernel 2>&1 | grep "Authority"

Linux (通常更关注 GPG 签名或包管理签名)

#!/bin/bash
# 检查内核模块是否被签名 (部分发行版如 Ubuntu Secure Boot)
# Linux 的 "数字签名" 通常指 Secure Boot 或模块签名
mokutil --sb-state   # 查看 Secure Boot 状态
# 检查特定内核模块的签名
modinfo -F signature /lib/modules/$(uname -r)/kernel/fs/ext4/ext4.ko.xz

完整建议流程

  1. 基础检查:使用 PowerShell Get-AuthenticodeSignature 检查 ntoskrnl.exebootmgfw.efi
  2. 策略检查:使用 bcdedit 查看 testsigningnointegritychecks 标志。
  3. 硬件安全:使用 PowerShell Confirm-SecureBootUEFI 检查 Secure Boot。
  4. 批量审计:使用 sigcheck -s C:\Windows\System32\drivers 检查所有驱动签名。

注意事项

  • 管理员权限:大部分签名检查(尤其是 bcdeditsigcheck 扫描驱动目录)需要以管理员身份运行
  • 第三方工具依赖sigcheck 需要单独下载,但它是微软官方工具,安全可靠。
  • 签名状态解读
    • Valid:签名有效且受信任。
    • Unknown:签名有效但证书链不受信任(常见于测试证书)。
    • NotSigned:文件未签名(合法情况如某些旧版工具)。
    • HashMismatch:签名无效(文件可能被篡改或损坏)。

选择最适合你需求的方法,PowerShell + Get-AuthenticodeSignature 是最直接且无需额外工具的方案。

抱歉,评论功能暂时关闭!