Apple Silicon平台HoRNDIS kext加载失败(签名错误)求助
针对Apple Silicon设备上编译HoRNDIS后签名成功但加载报"Bad code signature"错误的问题,可按以下步骤排查解决(无需关闭SIP):
确认证书类型合规
必须使用Kernel Extension Developer证书,普通App开发证书无法用于内核扩展签名。可通过以下命令检查证书扩展是否包含内核签名权限:security find-certificate -p -c "你的证书名称" | openssl x509 -text -noout需确保输出中存在
1.2.840.113635.100.6.1.13(Kernel Extension Code Signing)的OID标识。修正签名命令参数
Apple Silicon平台下签名kext必须添加--kernel参数,正确的签名命令格式为:codesign --sign "你的证书标识符/名称" --kernel --timestamp HoRNDIS.kext缺少
--kernel参数会导致签名不被内核认可,即使codesign返回成功也无效。用kmutil验证签名有效性
替代codesign -dvvvv,使用kmutil直接模拟内核校验逻辑,更精准定位问题:kmutil verify -v HoRNDIS.kext该命令会输出具体的签名错误原因,比如证书权限不足、文件完整性问题等。
统一编译与签名流程
避免先编译再手动签名,推荐在xcodebuild时直接指定签名证书,确保所有组件被正确签名:xcodebuild -sdk macosx -configuration Release CODE_SIGN_IDENTITY="你的证书名称"规范kext存放路径
第三方kext必须放在/Library/Extensions/目录下(/System/Library/Extensions/受SIP保护无法写入),移动后重新签名:sudo cp -R HoRNDIS.kext /Library/Extensions/ sudo codesign --sign "你的证书名称" --kernel --timestamp /Library/Extensions/HoRNDIS.kext手动授权kext加载
首次加载失败后,打开系统设置 > 隐私与安全性,底部会出现允许该开发者内核扩展的选项,点击允许后重启设备,再执行加载命令:sudo kmutil load -p /Library/Extensions/HoRNDIS.kext
内容的提问来源于stack exchange,提问作者Yunus Oksuz

