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

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


咨詢
建站咨詢
