该解决方案涉及代码签名的略微修改版本。本质上,主要区别是在签署证书时,在共同签名时必须传递权利 XML 文件。下面我从头到尾复制/粘贴了所有步骤的源软件网站的内容。
1.1。在系统钥匙串中创建证书
启动钥匙串访问应用程序(/Applications/Utilities/Keychain Access.app)
打开菜单项/钥匙串访问/证书助手/创建证书...
选择一个名称(示例中为 gdb-cert),将 Identity Type 设置为 Self Signed Root,将 Certificate Type 设置为 Code Signing,然后选择 Let me override defaults。单击 Continue 几次,直到出现 Specify a Location For The Certificate 屏幕,然后将 Keychain 设置为 System。
如果您无法将证书存储在系统钥匙串中:改为在登录钥匙串中创建它,然后将其导出。然后,您可以将其导入系统钥匙串。
最后,退出 Keychain Access 应用程序以刷新证书存储。
控制:在终端类型
security find-certificate -c gdb-cert
这应该显示有关您新铸造的证书的一些详细信息,例如
钥匙串:“/Library/Keychains/System.keychain”版本:256 类:0x80001000 属性:“alis”="gdb-cert" [...]
确保 keychain: 是系统钥匙串,如图所示。
另外,请确保您的证书尚未过期:
security find-certificate -p -c gdb-cert | openssl x509 -checkend 0
如果要检查整个 X509 数据结构,可以键入
security find-certificate -p -c gdb-cert |openssl x509 -noout -text
1.2. 信任用于代码签名的证书
再次启动钥匙串访问。使用证书的上下文菜单,选择获取信息,打开信任项,然后将代码签名设置为始终信任。
最后,再次退出 Keychain Access 应用程序以刷新证书存储。
控制:在终端类型
security dump-trust-settings -d
这应该显示 gdb-cert 证书(可能还有其他)及其信任设置,包括代码签名。
1.3. 签署并授权 gdb 二进制文件
(Mac OS X 10.14 及更高版本)创建包含以下内容的 gdb-entitlement.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.debugger</key>
<true/>
</dict>
</plist>
如果您在上一节中生成的证书称为 gdb-cert,请使用:
codesign --entitlements gdb-entitlement.xml -fs gdb-cert $(which gdb)
或在 Mojave (10.14) 之前,只需
codesign -fs gdb-cert $(which gdb)
如果 gdb 二进制文件位于普通用户无法写入的位置,您可能必须在此命令前面加上 sudo。
如果您计划经常构建 gdb,则可以通过传递 --enable-codesign=gdb-cert (再次假设 gdb-cert 是证书的名称)来配置来自动执行此步骤。
控制:在终端类型
codesign -vv $(which gdb)
对于 10.14 (Mojave) 之后的版本,还要检查权利:
codesign -d --entitlements - $(which gdb)
1.4. 刷新系统的证书和代码签名数据
最可靠的方法是重新启动系统。
一种侵入性较小的方法是通过终止当前正在运行的 taskgated 进程来重新启动 taskgated 服务(在进程中的任何时间,但不迟于再次尝试运行 gdb 之前):
sudo killall taskgated
但是,有时 taskgated 服务在杀死它后不会成功重新启动,因此通过检查例如 ps $(pgrep -f taskgated) 确保它在此步骤后处于活动状态。或者只是重新启动您的系统,如上所述。