新聞中心
蘋(píng)果系統(tǒng)運(yùn)行著一些現(xiàn)有的最大和最賺錢(qián)的軟件應(yīng)用程序生態(tài)系統(tǒng)。理論上,要進(jìn)入這些生態(tài)系統(tǒng),傳統(tǒng)上需要使用macOS,并加入蘋(píng)果開(kāi)發(fā)者計(jì)劃(Apple Developer Program)。

創(chuàng)新互聯(lián)主營(yíng)天寧網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,App定制開(kāi)發(fā),天寧h5小程序定制開(kāi)發(fā)搭建,天寧網(wǎng)站營(yíng)銷(xiāo)推廣歡迎天寧等地區(qū)企業(yè)咨詢
如果你想為 Apple 操作系統(tǒng)開(kāi)發(fā)應(yīng)用程序,你可能會(huì)使用 Apple 的操作系統(tǒng)和 Apple 的官方工具進(jìn)行開(kāi)發(fā)和分發(fā)。但對(duì)于開(kāi)源開(kāi)發(fā)人員通常希望以最小的努力分發(fā)跨平臺(tái)應(yīng)用程序。在整個(gè)編程語(yǔ)言生態(tài)系統(tǒng)中,你運(yùn)行的操作系統(tǒng)被抽象為許多應(yīng)用程序的實(shí)現(xiàn)細(xì)節(jié)。通過(guò)創(chuàng)建 macOS、iOS 等開(kāi)發(fā)需要直接訪問(wèn) macOS 和通常高于市場(chǎng)價(jià)格的Apple 硬件的要求,蘋(píng)果軟件生態(tài)系統(tǒng)強(qiáng)加的分發(fā)要求是有效的排他性,并阻止利益相關(guān)方對(duì)進(jìn)入其生態(tài)系統(tǒng)。
在蘋(píng)果平臺(tái)上發(fā)布軟件的一個(gè)問(wèn)題是代碼簽署和公證,即你需要:
1.在應(yīng)用程序中嵌入加密簽名,有效地證明來(lái)自 Apple Developer Program 關(guān)聯(lián)帳戶的真實(shí)性。 (這是簽名。)
2.將你的應(yīng)用程序上傳到 Apple,以便他們對(duì)其進(jìn)行檢查,驗(yàn)證它符合要求,可能還會(huì)存儲(chǔ)一個(gè)副本。然后,蘋(píng)果會(huì)發(fā)布自己的加密簽名,即公證書(shū),然后需要將其嵌入到正在分發(fā)的應(yīng)用程序上,這樣蘋(píng)果的操作系統(tǒng)才能信任它。(這是公證。)
從歷史上看,這些步驟需要 Apple 專(zhuān)有軟件專(zhuān)門(mén)從 macOS 運(yùn)行。這意味著,即使你在 Rust、Go 等軟件生態(tài)系統(tǒng)或 Web 平臺(tái)中,你可以在不直接訪問(wèn) macOS 的情況下交叉編譯應(yīng)用程序(測(cè)試顯然是另一回事),如果你愿意,你仍然需要 macOS簽署和公證你的申請(qǐng)。由于默認(rèn)的安全設(shè)置,在macOS上需要有效的簽名和公證。在 iOS 等移動(dòng)平臺(tái)上,除非你運(yùn)行的是越獄設(shè)備,否則不可能發(fā)布未經(jīng)簽名和公證的應(yīng)用程序。
如果我不需要macOS來(lái)構(gòu)建我的應(yīng)用程序,為什么我要被迫把蘋(píng)果設(shè)備作為我的軟件發(fā)布過(guò)程的一部分?為什么在發(fā)布的時(shí)候,我必須簽署和公證我的申請(qǐng),它不能更簡(jiǎn)化嗎?
如果能重新實(shí)現(xiàn) Apple 代碼簽名,以便開(kāi)發(fā)人員有更多的靈活性和機(jī)會(huì)將應(yīng)用程序分發(fā)到 Apple 的生態(tài)系統(tǒng)。其最終目標(biāo)是擴(kuò)大 Apple 生態(tài)系統(tǒng)對(duì)更多開(kāi)發(fā)者的訪問(wèn)。
首先,得益于 rcodesign 0.14.0的發(fā)布。這是我第一次發(fā)布 rcodesign 的預(yù)構(gòu)建二進(jìn)制文件(Linux、Windows 和 macOS)。
macOS rcodesign 可執(zhí)行文件是自簽名的,它由 GitHub Actions Linux 運(yùn)行程序使用 YubiKey 獨(dú)有的代碼簽名證書(shū)進(jìn)行簽名。
2021年,apple-codesign 項(xiàng)目/Rust crate 發(fā)生了很大變化!只需查看更改日志!
這個(gè)項(xiàng)目從tugger-apple-codesign改名而來(lái)。
如果你是通過(guò) cargo install 安裝的,你需要 cargo install --force apple-codesign 來(lái)強(qiáng)制 Cargo 用另一個(gè) crate 中的一個(gè)來(lái)覆蓋 rcodesign 可執(zhí)行文件。
rcodesign CLI可執(zhí)行文件仍然存在,而且比以往任何時(shí)候都更強(qiáng)大。你仍然可以在Linux、Windows、macOS和任何其他平臺(tái)上對(duì)Apple應(yīng)用程序進(jìn)行簽名,你可以在這些平臺(tái)上編譯Rust程序。
這與 PyOxidizer 的文檔一起發(fā)布在 readthedocs.io 上(因?yàn)槲沂褂玫氖?monorepo)。那里有一些通用文檔,例如有關(guān)如何通過(guò)將你自己的替代代碼簽名 PKI 部署到并行 Apple 來(lái)選擇性地繞過(guò) Gatekeeper 的指南。
支持簽名包、DMG 和 .pkg 安裝程序
當(dāng)我去年宣布這個(gè)項(xiàng)目時(shí),只有 Mach-O 二進(jìn)制文件和非常簡(jiǎn)單的 .app 包是可簽名的。即便如此,也有很多微妙的問(wèn)題。
Rcodesign sign現(xiàn)在可以對(duì)更復(fù)雜的包進(jìn)行簽名,包括許多嵌套的包。有報(bào)道稱iOS應(yīng)用包簽名正確。
該工具還支持簽名.dmg磁盤(pán)映像文件和.pkg扁平封裝包安裝程序。
已知的簽名限制現(xiàn)在記錄在 Sphinx 文檔中。
我相信 rcodesign 現(xiàn)在支持對(duì)用于 Apple 軟件分發(fā)的所有主要文件格式進(jìn)行簽名。
支持 Linux、Windows 和 macOS 上的公證
蘋(píng)果發(fā)布了一個(gè)名為T(mén)ransporter的Java工具,可以讓你上傳文物到蘋(píng)果進(jìn)行公證。它們使這個(gè)工具可用于Linux、Windows,當(dāng)然還有macOS。
雖然這個(gè)工具不是開(kāi)源的,但使用這個(gè)工具可以讓你在 Linux 和 Windows 上進(jìn)行公證,同時(shí)仍然使用 Apple 的官方工具與他們的服務(wù)器通信。
rcodesign 現(xiàn)在支持調(diào)用 Transporter 并將工件上傳到 Apple 進(jìn)行公證。我們現(xiàn)在支持公證包、.dmg 磁盤(pán)映像和 .pkg 扁平封裝安裝程序包。我已經(jīng)成功地從 Linux 公證了所有這些應(yīng)用程序類(lèi)型。
由于支持對(duì)所有應(yīng)用程序類(lèi)型進(jìn)行簽名和公證,現(xiàn)在可以在沒(méi)有 macOS 參與發(fā)布過(guò)程的情況下發(fā)布 Apple 軟件。
YubiKey 集成
我嘗試盡可能多地使用我的 YubiKey,因?yàn)榇鎯?chǔ)在 YubiKey 上的密鑰或私鑰可能比位于某個(gè)文件系統(tǒng)上的密鑰或私鑰更安全。如果你破解了我的設(shè)備,你很可能會(huì)獲得我的私鑰。但是你需要物理訪問(wèn)我的 YubiKey 并強(qiáng)迫或強(qiáng)迫我解鎖它,以獲得訪問(wèn)其私鑰的權(quán)限。
rcodesign 現(xiàn)在支持使用 YubiKeys 進(jìn)行簽名操作。
這確實(shí)需要默認(rèn)的智能卡 Cargo 功能。因此,如果手動(dòng)構(gòu)建,你將需要例如cargo install --features smartcard apple-codesign.。
YubiKey 集成來(lái)自 yubikey 。這個(gè) crate 將直接與 macOS 和 Windows 中內(nèi)置的智能卡 API 對(duì)話。所以如果你有一個(gè)啟用了 YubiKey 支持的 rcodesign 構(gòu)建,YubiKeys 應(yīng)該可以工作。通過(guò)插入 YubiKey 并運(yùn)行 rcodesign smartcard-scan 進(jìn)行嘗試。
我甚至實(shí)現(xiàn)了一些命令來(lái)輕松管理 YubiKey 上的代碼簽名證書(shū)。例如,你可以直接在設(shè)備上運(yùn)行 rcodesign smartcard-generate-key --smartcard-slot 9c 以生成新的私鑰,然后 rcodesign generate-certificate-signing-request --smartcard-slot 9c --csr-pem-path csr.pem將該證書(shū)導(dǎo)出到證書(shū)簽名請(qǐng)求 (CSR),你可以在 developer.apple.com 上交換 Applie 頒發(fā)的簽名證書(shū)。這意味著你可以輕松創(chuàng)建其私鑰直接在硬件設(shè)備上生成且永遠(yuǎn)無(wú)法導(dǎo)出的代碼簽名證書(shū)。以這種方式生成密鑰比將密鑰存儲(chǔ)在軟件庫(kù)(比如蘋(píng)果的Keychains)中更安全。
遠(yuǎn)程代碼簽名
我最感興趣的功能是我稱之為遠(yuǎn)程代碼簽名的功能。
我在GitHub托管的Linux GitHub Actions運(yùn)行程序上簽署了一個(gè)macOS通用Mach-O可執(zhí)行文件,使用的YubiKey物理連接到我桌子旁邊的Windows 11設(shè)備上。未在計(jì)算機(jī)之間復(fù)制簽名的應(yīng)用程序。
我有一個(gè)調(diào)用 rcodesign sign --remote-signer 的 GitHub Actions 工作流程。我手動(dòng)觸發(fā)了該工作流程,并開(kāi)始使用瀏覽器觀察近乎實(shí)時(shí)的作業(yè)輸出。rcodesign sign --remote-signer 打印出一些指令(包括一堵 base64 編碼數(shù)據(jù)的墻)以指示下一步該做什么。重要的是,它要求其他人運(yùn)行 rcodesign remote-sign 以繼續(xù)簽名過(guò)程。
該日志向我們展示了使用 YubiKey 進(jìn)行連接和身份驗(yàn)證,以及一些關(guān)于與遠(yuǎn)程服務(wù)器對(duì)話的狀態(tài)更新。
遠(yuǎn)程簽名使我能夠從 GitHub 運(yùn)營(yíng)的 GitHub Actions 運(yùn)行程序簽署 macOS 應(yīng)用程序,同時(shí)使用安全存儲(chǔ)在我的 YubiKey 上的代碼簽名證書(shū),該證書(shū)插入到距 GitHub Actions 運(yùn)行程序數(shù)百公里的 Windows 設(shè)備上。
這里發(fā)生的是 2 個(gè) rcodesign 進(jìn)程通過(guò)中央中繼服務(wù)器橋接的 websocket 相互通信。我免費(fèi)操作一個(gè)默認(rèn)服務(wù)器。服務(wù)器是開(kāi)源的,如果你想運(yùn)行你自己的服務(wù)器,你可以使用terrform模塊,希望只需要花幾分鐘時(shí)間。當(dāng)啟動(dòng)設(shè)備希望創(chuàng)建簽名時(shí),它向請(qǐng)求加密簽名的簽名者發(fā)送一條消息。然后將簽名發(fā)送回發(fā)起者,發(fā)起者將其合并。
我設(shè)計(jì)這個(gè)特性時(shí)考慮到了CI系統(tǒng)的自動(dòng)發(fā)布(比如GitHub Actions)。我想要一種方法,可以簡(jiǎn)化應(yīng)用程序的代碼簽名和發(fā)布過(guò)程,而不必給CI中的低信任設(shè)備無(wú)限訪問(wèn)我的私人簽名密鑰的權(quán)限。這可能在許多其他場(chǎng)景中都是有用的。你是否曾經(jīng)因?yàn)闆](méi)有蘋(píng)果發(fā)行的代碼簽名證書(shū)而通過(guò)電子郵件或下拉框?qū)?yīng)用程序發(fā)送給別人簽名?現(xiàn)在你有了一個(gè)不需要復(fù)制文件的替代解決方案。只要你可以看到啟動(dòng)設(shè)備的日志輸出,或者將輸出傳遞給你(例如通過(guò)聊天應(yīng)用程序或電子郵件),你就可以在另一臺(tái)設(shè)備上遠(yuǎn)程簽署文件!
關(guān)于遠(yuǎn)程簽名安全性
Websockets 通過(guò)由第三方操作的中央服務(wù)器?!授予遠(yuǎn)程設(shè)備訪問(wèn)權(quán)限以對(duì)任意內(nèi)容執(zhí)行代碼簽名?!你的恐懼和懷疑是 100% 有道理的:我也會(huì)這么想!
促進(jìn)遠(yuǎn)程代碼簽名的服務(wù)會(huì)成為一個(gè)非常有利可圖的攻擊目標(biāo),如果被濫用,它可能被用來(lái)強(qiáng)制使用有效的代碼簽名證書(shū)的各方簽署不想要的代碼,如惡意軟件。實(shí)現(xiàn)這樣的功能有很多很多很多錯(cuò)誤的方法。
遠(yuǎn)程代碼簽名設(shè)計(jì)和安全注意事項(xiàng)包含了我的一些高級(jí)設(shè)計(jì)目標(biāo)和安全評(píng)估。遠(yuǎn)程代碼簽名協(xié)議詳細(xì)介紹了通信協(xié)議,包括所涉及的加密(實(shí)際的加密,而不是流行的加密)。關(guān)鍵在于協(xié)議和服務(wù)器的設(shè)計(jì)使惡意服務(wù)器或中間人無(wú)法偽造簽名請(qǐng)求。簽名會(huì)話在幾分鐘后過(guò)期,第三方或服務(wù)器無(wú)法注入會(huì)導(dǎo)致不需要簽名的惡意消息。通過(guò)初始握手獲得會(huì)話臨時(shí)共享加密密鑰,并從那里使用對(duì)稱加密密鑰,因此對(duì)等方之間的所有有意義的消息都是端到端加密的。惡意服務(wù)器可以做的最糟糕的事情就是進(jìn)行拒絕服務(wù)。
我相信我的遠(yuǎn)程簽名實(shí)現(xiàn)比許多常見(jiàn)做法更安全,因?yàn)榻裉斓某R?jiàn)做法需要復(fù)制私鑰并讓低信任度設(shè)備(如 CI 工作人員)訪問(wèn)私鑰或者文件在沒(méi)有加密監(jiān)管鏈的情況下被復(fù)制以證明不會(huì)被篡改。是的,遠(yuǎn)程簽名為遠(yuǎn)程訪問(wèn)引入了使用簽名密鑰的向量。但是按照我的意圖進(jìn)行實(shí)踐,遠(yuǎn)程簽名可以消除復(fù)制私鑰或授予對(duì)它們的無(wú)限訪問(wèn)權(quán)限的需要。從威脅建模的角度來(lái)看,我認(rèn)為密鑰訪問(wèn)中的網(wǎng)絡(luò)限制使得遠(yuǎn)程簽名比現(xiàn)在許多人使用的私鑰管理實(shí)踐更安全。
話雖如此,這里的星號(hào)是我實(shí)現(xiàn)了我自己的密碼系統(tǒng)來(lái)實(shí)現(xiàn)端到端消息安全。如果在設(shè)計(jì)或?qū)崿F(xiàn)中存在漏洞,密碼系統(tǒng)可能會(huì)崩潰,從而帶來(lái)對(duì)消息偽造的防御。屆時(shí),惡意服務(wù)器或特權(quán)網(wǎng)絡(luò)攻擊者可能會(huì)強(qiáng)迫某人簽署不需要的軟件。但這很可能是損害的程度:對(duì)簽名密鑰的脫機(jī)攻擊是不可能的,因?yàn)楹灻枰嬖冢宜借€永遠(yuǎn)不會(huì)通過(guò)網(wǎng)絡(luò)傳輸。即使沒(méi)有端到端加密,該系統(tǒng)也比將你的私有密鑰作為一個(gè)容易被竊取的CI秘密(或類(lèi)似的)留在周?chē)踩?/p>
Apple 鑰匙串支持
從0.14 版本開(kāi)始,我們現(xiàn)在可以提前支持使用存儲(chǔ)在 Apple 鑰匙串中的代碼簽名證書(shū)進(jìn)行簽名!如果你在 Keychain Access 或 Xcode 中創(chuàng)建了 Apple 代碼簽名證書(shū),那么這可能就是你的代碼簽名證書(shū)所在的位置。
我拖延了很長(zhǎng)一段時(shí)間,因?yàn)槲覜](méi)有意識(shí)到這有什么好處:如果你使用macOS,只需使用 蘋(píng)果的官方工具。但是隨著rcodesign獲得了對(duì)遠(yuǎn)程代碼簽名的支持,以及其他一些功能,這些功能可以讓它成為所有平臺(tái)上蘋(píng)果工具的有力替代品,我認(rèn)為我們應(yīng)該提供這個(gè)功能,這樣我們就不會(huì)再阻止人們從keychain導(dǎo)出私鑰了。
Apple 的代碼簽名很復(fù)雜。 蘋(píng)果的工具和rcodesign之間很容易出現(xiàn)細(xì)微差別。
rcodesign 現(xiàn)在有 print-signature-info 和 diff-signatures 命令來(lái)轉(zhuǎn)儲(chǔ)和比較與代碼簽名相關(guān)的 YAML 元數(shù)據(jù),以便更容易地比較代碼簽名實(shí)現(xiàn)甚至多個(gè)簽名操作之間的行為。
本文翻譯自:https://gregoryszorc.com/blog/2022/04/25/expanding-apple-ecosystem-access-with-open-source,-multi-platform-code-signing/如若轉(zhuǎn)載,請(qǐng)注明原文地址。
新聞名稱:通過(guò)開(kāi)源、多平臺(tái)代碼簽名擴(kuò)展Apple生態(tài)系統(tǒng)訪問(wèn)權(quán)限
網(wǎng)頁(yè)URL:http://www.dlmjj.cn/article/ccsshgg.html


咨詢
建站咨詢
