正常軟件的簽名+公證

1. 簽名app

codesign -fs "Developer ID Application: XXXXXXXX (XXXXXXXX)" --options=runtime XXXX.app --timestamp --deep --entitlements 'app-entitlements_merged.plist'

XXXX.app: replacing existing signature

2. 檢驗 codesign -dvvvv XXXX.app

3. 公證app

先壓縮XXXX.app 壓縮成XXXX.zip

xcrun notarytool submit XXXX.zip  --keychain-profile "com.XX.XXXXXXX"    --wait

當得到了

Successfully uploaded file
id: 58d8ebe1-0990-4cad-9463-0c0668a7278d
path: /Users/xiaowang/Desktop/XXXX/test/XXXX.zip
Waiting for processing to complete.
Current status: Accepted..............
Processing complete
id: 58d8ebe1-0990-4cad-9463-0c0668a7278d
status: Accepted

4. 打包pkg並且簽名

productbuild --component XXXX.app /Applications --sign "Developer ID Installer: XXXXXXXX (XXXXXXXX)" --product XXXX.app/Contents/Info.plist aaaaa.pkg

5. 校驗

pkgutil  --check-signature aaaaa.pkg

6. 公證pkg

 xcrun notarytool submit aaaaa.pkg  --keychain-profile "com.XX.XXXXXXX"    --wait

得到

Conducting pre-submission checks for aaaaa.pkg and initiating connection to the Apple notary service...
Submission ID received
id: a2493b61-6fa5-4a7b-b9a2-3cf881e1c2d5
Upload progress: 100.00% (95.5 MB of 95.5 MB)
Successfully uploaded file
id: a2493b61-6fa5-4a7b-b9a2-3cf881e1c2d5
path: /Users/xiaowang/Desktop/XXXX/test/aaaaa.pkg
Waiting for processing to complete.
Current status: Accepted.............
Processing complete
id: a2493b61-6fa5-4a7b-b9a2-3cf881e1c2d5
status: Accepted

查看日誌:

xcrun notarytool log a2493b61-6fa5-4a7b-b9a2-3cf881e1c2d5 --keychain-profile "com.XX.XXXXXX"   c.json

 

以上都是自己的操作日誌,但是很可惜,最後失敗了

 後面其實還有一個裝訂票據 xcrun stapler staple xxxx.pkg 

但是我報錯了 

否則的話 就可以驗證成功了

$ stapler validate xxxx.pkg

Processing: xxxx.pkg

The validate action worked!

以上純屬自己的操作理解, 這邊再轉載一下大佬,感覺這個大佬寫的很對

https://blog.csdn.net/qq_40776651/article/details/131934019

背景
在MacOS 10.15之前,應用如果沒有簽名,那麼首次打開時就會彈出這種“惡意軟件”的提示框。這時只要應用簽名了,就不會彈這個框。但在MacOS 10.14.5之後,應用如果沒有公證(簡單說就是將安裝包上傳到Apple審查),那麼就會彈出更嚴重的“惡意軟件”提示框。

準備
必須要有開發者賬號
通過開發者賬號生成簽名證書。此處需要注意,如果不僅僅是簽名APP,還想簽名安裝包的話,需要兩個證書(Developer ID Application/Developer ID Installer)。在創建證書時,需要注意勾選必要的擴展服務。 //這裏的擴展服務 我有點不理解 到底是什麼?
將證書安裝在打包的Mac上
簽名
步驟一:爲APP簽名

codesign --force --sign "$SIGNING_IDENTITY" --entitlements="$ENTITLEMENTS" --options=runtime "$APP_PATH"
變量說明:

SIGNING_IDENTITY:證書名稱,示例:Developer ID Application: xxxx (ABCDEFGHIJ)。
ENTITLEMENTS:用於定義應用程序的權限和特權,示例:xxxx.entitlements。
APP_PATH:APP所在路徑
驗證簽名:

codesign --verify --verbose "$APP_PATH"
步驟二:打包APP

pkgbuild --component "$APP_PATH" --identifier "$IDENTIFIER" --version 6.0 --install-location /Applications "$COMPONENT_PKG_PATH"
變量說明:

APP_PATH:APP所在路徑
IDENTIFIER:APP的identifier,在APP的Info.plist文件中有該字段,用開發者賬號創建自己的APP時可定義。
COMPONENT_PKG_PATH:安裝包存放目錄
此處用 productbuild 亦可。我自己的理解是 pkgbuild 打包的是組件安裝包,productbuild 是用來打包產品安裝包 。一個安裝包可能會有多個組件構成,但是我的 app 安裝包只有一個組件,所以 pkgbuild 和 productbuild 都可。

當時爲了趕任務進度,並沒有多考慮,就又用 productbuild 打了下 pkgbuild 的輸出物。

productbuild --package "$COMPONENT_PKG_PATH" "$PRODUCT_PKG_PATH"
步驟三:簽名pkg

productsign --sign "$INSTALLER_IDENTITY" "$PRODUCT_PKG_PATH" "$PRODUCT_SIGN_PKG_PATH"
變量說明:

INSTALLER_IDENTITY:證書名稱,示例:Developer ID Installer: xxxx (ABCDEFGHIJ)。
PRODUCT_PKG_PATH:產品安裝包路徑。
PRODUCT_SIGN_PKG_PATH:完成簽名後的產品安裝包存放位置。
驗證簽名:

pkgutil --check-signature "$PRODUCT_SIGN_PKG_PATH"
公證
altool:使用的舊的 Apple Notary Service,適用於 Xcode 12 以及更早的版本,但是需要注意的是Apple 將會在 2023 年秋季停止對它的支持。

xcrun notarytool store-credentials "123123123" --apple-id "[email protected]" --team-id "ABCDEFGHIJ" --password "XXXX-XXXX-XXXX-XXXX"
xcrun notarytool submit "$PRODUCT_SIGN_PKG_PATH" --keychain-profile "123123123" --wait
參數和變量說明:

store-credentials: 存儲憑證,這個隨便輸入,但是一定要記住。
apple-id:開發者賬號。
team-id:組ID,就是證書名稱()中的內容。
password:應用專屬密碼,用開發者賬號生成,生成完畢一定要記住。
PRODUCT_SIGN_PKG_PATH:產品安裝包路徑。
keychain-profile:存儲憑證(就是之前隨便輸入的)。
wait:這個參數是等公證結束反饋結。
裝訂票據
xcrun stapler staple "$PRODUCT_SIGN_PKG_PATH"
我看蘋果官網文檔時,自己把它翻譯成裝訂票據,可能譯過來並不準確。這個命令的作用是用於向已簽名的應用程序或安裝包(PKG 文件)添加 "ticket",以標記該應用程序或安裝包已被"stapled"。Stapler 是 Apple 提供的一個工具,用於支持應用程序的安全性和分發驗證。"staple" 的作用是將一個由 Apple 頒發的 "ticket" 綁定到應用程序或安裝包中,證明該應用程序或安裝包已經經過蘋果的公證和驗證。這樣,用戶在下載和安裝應用程序時,系統會自動檢查該 "ticket",確認應用程序已經被簽名和公證,從而增加用戶對應用程序的信任。

 

FAQ:

很少人會先看完文檔再動手,你們可能會在過程中遇到好多坑。

簽名失敗。確保證書相應的擴展服務是否開啓,比如說:代碼簽名。安裝包不需要這個擴展服務。其次就是,MacOS是否放開了對證書的訪問權限。打開“鑰匙串訪問”-“系統”-“我的證書”:點開證書前的>,然後查看密鑰詳情,訪問控制改爲“允許所有應用程序訪問此項目”。
公證失敗。根據公證反饋的UUID來查看錯誤日誌。蘋果官方會根據錯誤給出解決方法。
xcrun notarytool log "UUID" --keychain-profile "123123123"
列出我遇到的問題:
可執行程序簽名時未進行強制運行時:在app簽名後,單獨再簽名這個可執行程序,並 加上參數"--options=runtime"。
codesign --force --sign "$SIGNING_IDENTITY" --options=runtime $APP_PATH/Contents/MonoBundle/createdump
第三方庫未簽名,單獨對這些第三方庫進行簽名即可。

find "$APP_PATH/Contents/MonoBundle" | while read -r MonoBundle_Files_Name; do
if [[ -f "$MonoBundle_Files_Name" && "${MonoBundle_Files_Name##*.}" = "dylib" ]];then
echo "[INFO] Signing $MonoBundle_Files_Name"
codesign --force --sign "$SIGNING_IDENTITY" "$MonoBundle_Files_Name"
fi
done

公證成功後,安裝程序安裝成功,但是APP運行崩潰。可能是codesign的entitlements參數指定的權限文件內容缺少。這可能是強化運行時帶來的問題,此處推薦官方鏈接:強化運行時 |蘋果開發者文檔 (apple.com)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章