Buf*_*fer 8 macos code-signing ios swift
我在 MacOS 上的应用程序中放置了一个可执行的二进制 XXX,并对其进行代码签名。我的应用程序将通过端口使用此服务。
安装我的应用程序后,可执行二进制文件 XXX 将通过 plist 文件注册服务,plist 文件包含DYLD_LIBRARY_PATH,它告诉可执行二进制文件在哪里可以找到要使用的 dylib。
launchctl load -wF "$HOME/Library/LaunchAgents/local.plist"
launchctl 启动本地
这是问题所在:
在我构建应用程序后它运行良好。
但是当我全部签名并公证时,然后打开我的应用程序使用,它会得到如下错误:
dyld: Library not loaded: @@HOMEBREW_PREFIX@@/opt/libev/lib/libev.4.dylib
Referenced from: /Users/buffer/Library/Application Support/XXX
Reason: unsafe use of relative rpath @@HOMEBREW_PREFIX@@/opt/libev/lib/libev.4.dylib in /Users/buffer/Library/Application Support/XXX with restricted binary
Run Code Online (Sandbox Code Playgroud)
它将使用默认的 dylib 路径?@@HOMEBREW_PREFIX@@/opt/libev/lib/libev.4.dylib? 来自可执行二进制 XXX,而不是我的自定义 DYLD_LIBRARY_PATH。Apple 已限制二进制文件使用这种不安全的相对 rpath。
更新:
我的应用程序将启动一个 shell 脚本来安装可执行二进制文件 XXX 和 dylib ,可执行二进制文件 XXX 将注册为服务以通过 plist 启动和停止,如下所示
launchctl load -wF "$HOME/Library/LaunchAgents/local.plist"
launchctl 启动本地
我的可执行二进制 XXX 路径和 DYLD_LIBRARY_PATH 都位于 /Users/buffer/Library/Application Support/myApp/*** ,它作为我的应用程序使用的服务单独启动。
我发现了以下几种情况:
1.我有一个相同的可执行二进制 XXX 签名于 2018-09-25 ,它工作正常。
2. 未签名的可执行二进制 XXX 也可以正常工作。
3.但是当我现在已经签署了可执行二进制文件 XXX 并将它与 dylib 一起使用时,它会得到上面的错误。
那么 ? 苹果标志算法是否发生了变化并导致此错误发生? 这是我现在的代码签名命令,如下所示:
codesign --force --options runtime --sign "开发者 ID 应用程序:****" XXX
我发现了一个问题,Apple 现在要求开发人员为每个应用程序启用Hardened 运行时才能进行通知。如果您启用 Hardened 运行时但未指定权利,则默认情况下将禁用某些权限。
我使用 DYLD 环境变量的权限已被默认禁用
你可以在下面查看这个文件
如果您像我一样自定义代码签名工作流程,则可以在代码签名时指定权限,如下所示,entitlements.plist 包含您要启用的权限
codesign --force --options runtime --entitlements /Users/buffer/Desktop/entitlements.plist --sign "Developer ID Application: ****" XXX
Run Code Online (Sandbox Code Playgroud)
从 macOS 10.10.4 开始,出于安全原因,不允许在 Apple 认为安全的目录之外使用 dylib,例如:
/System/
/usr/bin/
/Library/Frameworks/
Run Code Online (Sandbox Code Playgroud)
题为“ Checking Gatekeeper Conformance ”的代码签名文档明确指出:
从 macOS 10.10.4 开始,Gatekeeper 会验证没有从应用程序包外部加载任何库。如果应用程序使用
@rpath或 绝对路径链接到应用程序外部的动态库,Gatekeeper 会拒绝该应用程序。此限制适用于应用程序的主要可执行文件和捆绑包中的任何其他可执行文件,包括库。即使路径不存在(这通常会导致动态链接器回退到包内的库),此限制也适用。该错误将出现在系统日志中,对于MyApp.app尝试链接libLibrary.dylib到非标准位置的库的应用程序,会显示如下消息/foo
因此,您应该将 dylib 嵌入您的应用程序中。
显然,另一种可能的解决方案是使用签名安装程序在 安装通用框架/Library/Frameworks/,但该解决方案是由 DTS 提供的,显然不是官方文档的一部分。
| 归档时间: |
|
| 查看次数: |
3997 次 |
| 最近记录: |