From 28b1ccf0d277a1ddab8b50de79459c9b383e8440 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98=E9=98=BF=E6=B1=9F=28Relakkes?= =?UTF-8?q?=29?= Date: Thu, 16 Apr 2026 21:13:43 +0800 Subject: [PATCH] =?UTF-8?q?fix(desktop):=20=E7=A7=BB=E9=99=A4=20canonical?= =?UTF-8?q?=20.app=20=E9=87=8D=E7=AD=BE=E5=90=8D,=E9=81=BF=E5=85=8D=20Keyc?= =?UTF-8?q?hain=20ACL=20=E5=A4=B1=E9=85=8D=E5=AF=BC=E8=87=B4=20403?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 症状: 桌面端激活 Claude Official provider 后所有请求报 403 "Request not allowed",Tauri 原生产物(target/.../bundle/macos/) 能跑,但脚本输出的 canonical 产物(build-artifacts/macos-arm64/)报错。 根因: 脚本里的 sign_app_bundle() 用 `codesign --force --deep --sign -` 对 sidecar 和外层 .app 重签,想统一 signing identifier,但这会改变 sidecar binary 的 code signature hash。macOS Keychain ACL 按 hash 识别 caller —— 重签后的 sidecar 对 Keychain 来说是"陌生 binary", 弹"允许访问"对话框但 sidecar 无 UI 弹不出,被静默拒绝,CLI 读不到 OAuth token,SDK 构造空 Authorization,Anthropic 返回 403。 修复: 移除 sign_app_bundle 及其调用。Tauri 的 --no-sign flag 只是不做 Developer ID 签名,ad-hoc 签名 Tauri 自己已经做好了,再签一次纯属 多此一举,还破坏了 Tauri 签好的 Keychain ACL 关系。 Co-Authored-By: Claude Opus 4.6 (1M context) --- desktop/scripts/build-macos-arm64.sh | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/desktop/scripts/build-macos-arm64.sh b/desktop/scripts/build-macos-arm64.sh index c471a6c1..e5e1998a 100755 --- a/desktop/scripts/build-macos-arm64.sh +++ b/desktop/scripts/build-macos-arm64.sh @@ -148,17 +148,6 @@ if [[ -z "${LATEST_APP}" ]]; then LATEST_APP="$(find_latest_dir "${FALLBACK_APP_DIR}" '*.app')" fi -sign_app_bundle() { - local app_bundle="$1" - local sidecar_path="${app_bundle}/Contents/MacOS/claude-sidecar" - - if [[ -f "${sidecar_path}" ]]; then - codesign --force --sign - --identifier "${APP_BUNDLE_ID}.sidecar" --timestamp=none "${sidecar_path}" - fi - - codesign --force --deep --sign - --identifier "${APP_BUNDLE_ID}" --timestamp=none "${app_bundle}" -} - build_canonical_dmg() { local app_bundle="$1" local dmg_output="$2" @@ -233,8 +222,14 @@ if [[ -n "${LATEST_DMG}" ]]; then fi if [[ -n "${LATEST_APP}" ]]; then + # 注意: 不要再对 .app 重签名。曾经脚本在这里跑过 + # `codesign --force --deep --sign - --identifier ` 来统一 + # sidecar 和外层的 signing identifier,但这会改变 sidecar binary 的 + # code signature hash —— macOS Keychain ACL 按 hash 识别 caller, + # 重签完再访问时会被 ACL 当作"陌生 binary"静默拒绝,导致 CLI 读不到 + # OAuth token,最终请求打到 Anthropic 返回 403 "Request not allowed"。 + # Tauri 的 --no-sign 其实已经做了 ad-hoc 签名,直接用即可。 cp -R "${LATEST_APP}" "${CANONICAL_OUTPUT_DIR}/" - sign_app_bundle "${CANONICAL_OUTPUT_DIR}/${APP_BUNDLE_NAME}" rm -f "${CANONICAL_OUTPUT_DIR}/"*.dmg build_canonical_dmg \ "${CANONICAL_OUTPUT_DIR}/${APP_BUNDLE_NAME}" \