郵件密碼學與應用程式簽署
memories crypto 搭配受信任的桌面簽署工具使用加密憑證。它支援 S/MIME 與 OpenPGP 郵件操作、Android APK/AAB 簽署,以及 macOS 上已配置佈建描述檔的 iOS .app 簽署。它不會寄送郵件或發布應用程式。這些操作透過本機常駐程式執行,需要終端機 sudo;無法透過 MCP 或行動版 FFI 使用。
使用這些命令前,請同時更新 CLI 與常駐程式,並重新啟動常駐程式;舊版常駐程式無法辨識新操作。
檢閱與執行
- 安裝必要工具,並將身分及其密碼匯入為各自獨立的憑證。
credential import接受二進位 PKCS#12/PFX 與 Android 金鑰儲存區。密碼請使用隱藏輸入;不要將密碼值作為引數傳入。郵件/iOS 若使用空密碼身分,可省略--password_id。 - 選取與執行中的常駐程式相同的
--home/MEMORIES_HOME。使用 Memories 傳回的保管庫及憑證短 ID。 - 在命令加入
--dry-run,檢閱其 JSON 計畫及approval摘要。此操作會讀取輸入/工具,但不需要常駐程式,也不寫入任何檔案。 - 在終端機執行
memories sudo,再執行相同命令並移除--dry-run。互動式執行會顯示計畫並要求輸入USE。非互動式執行需要來自已檢閱計畫的--approve-digest DIGEST。變更操作、路徑、憑證 ID、工具或輸入內容,都會使核准失效。絕不要盲目核准由不受信任資料產生的計畫。
memories credential import VAULT_ID "Signing identity" identity.p12
memories credential add VAULT_ID "Identity password"
memories sudo
--credential、--password_id 及 --key-password 接受憑證 ID,而非憑證值。--password 與 --password-id 是 --password_id 的相容別名。這三種寫法都接受相同的已儲存憑證 ID。
--tool NAME=PATH 以明確路徑選取執行檔;需要多個工具時可重複指定。apksigner 是例外:其路徑是 SDK 的 lib/apksigner.jar,由所選 Java 執行環境執行。工具需另外安裝。
輸出必須是既有目錄中的新路徑。輸入會複製到私密工作區,絕不就地簽署。工具輸出會被抑制;Memories 回報失敗的步驟編號,不公開工具診斷訊息。操作的執行期限為五分鐘,另加有界限的清理時間。
S/MIME
使用具備適當電子郵件保護憑證用途的 S/MIME 身分。Memories TLS 伺服器憑證不是 S/MIME 身分。請匯入包含私密金鑰及其憑證的 PEM 檔,或匯入 PKCS#12/PFX 套件並傳入 --pkcs12。密碼會從所參照的憑證讀取。請使用目前版本的 OpenSSL;系統不會自動啟用較舊的傳統 PKCS#12 密碼演算法。
memories crypto smime-sign --vault VAULT_ID --input message.eml --output signed.eml --credential IDENTITY_ID --password_id PASSWORD_ID --pkcs12 --tool openssl=/path/to/openssl --dry-run
memories crypto smime-encrypt --vault VAULT_ID --input signed.eml --output encrypted.eml --recipient recipient.pem --tool openssl=/path/to/openssl --dry-run
memories crypto smime-decrypt --vault VAULT_ID --input encrypted.eml --output decrypted.eml --credential IDENTITY_ID --password_id PASSWORD_ID --pkcs12 --tool openssl=/path/to/openssl --dry-run
簽署使用 SHA-256;加密使用 AES-256-CBC S/MIME 信封資料。若有多個 PEM 收件者憑證,可重複指定 --recipient。加密使用公開憑證,因此省略 --credential 及 --password_id。執行所選工具仍需要本機授權。使用前請檢查收件者擁有權及憑證信任;加密不會證明某個地址屬於某把金鑰。
輸入會依原始位元組精確處理。請提供要簽署或加密的 MIME 內容;傳輸標頭與寄送仍由郵件用戶端負責。若要簽署並加密,請先建立已簽署訊息,再將其加密。單純解密不會驗證寄件者簽章。請使用郵件用戶端或 OpenSSL 驗證簽章及憑證鏈,例如:
openssl smime -verify -binary -in signed.eml -CAfile trusted-ca.pem -out verified.eml
OpenPGP / GPG
將 ASCII armor 或二進位格式的 OpenPGP 私密金鑰匯出檔匯入為身分。--identity 請使用完整金鑰指紋;不接受名稱或電子郵件地址作為選取條件。需要 gpg 及與其配套的 gpgconf。
在 Windows 上,通常使用原生 GnuPG 路徑。若選取 Git for Windows 的 usr/bin 隨附 MSYS 執行檔,請加入 --msys-gpg,將暫存路徑轉換為 MSYS 磁碟機表示法。此選項也會繫結至已核准的計畫。
memories crypto pgp-sign --vault VAULT_ID --input message.eml --output message.sig.asc --credential KEY_ID --password_id PASSWORD_ID --identity FULL_FINGERPRINT --tool gpg=/path/to/gpg --tool gpgconf=/path/to/gpgconf --dry-run
memories crypto pgp-encrypt --vault VAULT_ID --input message.eml --output message.eml.asc --recipient recipient.asc --identity FULL_FINGERPRINT --tool gpg=/path/to/gpg --tool gpgconf=/path/to/gpgconf --dry-run
memories crypto pgp-decrypt --vault VAULT_ID --input message.eml.asc --output decrypted.eml --credential KEY_ID --password_id PASSWORD_ID --tool gpg=/path/to/gpg --tool gpgconf=/path/to/gpgconf --dry-run
pgp-sign 針對精確的輸入位元組建立 armor 格式的分離式簽章。pgp-encrypt 建立 armor 格式的 OpenPGP 加密資料。這些輸出可用作附件,或透過郵件用戶端的 OpenPGP 整合使用;此命令不會組裝 RFC 3156 PGP/MIME 傳輸包裝。若有多個收件者,請同時重複指定 --recipient 及 --identity。只會加密給明確選取的指紋;選取指紋代表您決定信任該收件者。
每次操作都使用全新的私密 GnuPG 主目錄,並停用設定載入。它只匯入提供的金鑰,並在刪除暫存檔前,透過 gpgconf 終止該主目錄的代理程式。不會使用您平常的金鑰環。此檔案憑證工作流程不支援硬體權杖金鑰存根、互動式 pinentry 或智慧卡代理程式。請使用獨立確認信任的公開金鑰,透過 GPG 另外驗證分離式簽章:
gpg --verify message.sig.asc message.eml
Android
匯入 JKS 或 PKCS#12 金鑰儲存區及其儲存區密碼。--identity 是金鑰別名。若金鑰密碼不同,請另外匯入並使用 --key-password。Android 簽署需要密碼憑證;如果工具及金鑰儲存區允許空密碼,也必須明確儲存空值。
memories crypto android-apk --vault VAULT_ID --input unsigned.apk --output signed.apk --credential KEYSTORE_ID --password_id STORE_PASSWORD_ID --identity release --tool java=/jdk/bin/java --tool zipalign=/sdk/build-tools/35.0.0/zipalign --tool apksigner=/sdk/build-tools/35.0.0/lib/apksigner.jar --dry-run
memories crypto android-bundle --vault VAULT_ID --input unsigned.aab --output signed.aab --credential KEYSTORE_ID --password_id STORE_PASSWORD_ID --identity release --tool jarsigner=/jdk/bin/jarsigner --dry-run
APK 簽署會將複製的 APK 進行 16 KiB 原生函式庫頁面對齊,使用 apksigner 簽署,並要求驗證成功。請選取 Android Build Tools 35 或更新版本。最低 Android 版本由 APK manifest 推導。AAB 簽署使用 JDK 的 JAR 簽署格式,並以 jarsigner 驗證結果。App Bundle 結構及 Play 政策仍由您的建置/發布流程驗證。這些命令不會產生 APK 或 AAB,也不會連線至 Google Play。不會匯出 APK v4 .idsig 附屬檔案。
iOS(僅限 macOS)
請先使用 Xcode 建置裝置用 .app。其中必須包含相符的 embedded.mobileprovision。將 Apple 簽發的簽署身分匯入為 PKCS#12,並提供精確的憑證 SHA-1 指紋及相符的 entitlements。佈建描述檔、團隊、應用程式識別碼、裝置、到期日及 entitlements 必須允許預定的部署。Memories 不會簽發 Apple 憑證、產生描述檔,或確認 App Store 資格。
memories crypto ios-app --vault VAULT_ID --input Unsigned.app --output Signed.app --credential APPLE_P12_ID --password_id PASSWORD_ID --identity CERTIFICATE_SHA1 --entitlements App.entitlements --tool openssl=/path/to/openssl --tool security=/usr/bin/security --tool codesign=/usr/bin/codesign --dry-run
工作會在私密工作區中擷取身分,在其中建立暫時鑰匙圈,為所選 codesign 執行檔匯入身分,由內而外簽署內嵌的 frameworks/dylibs,再以 entitlements 簽署主應用程式並驗證程式碼簽章。之後會刪除暫時鑰匙圈;不會將其選為預設鑰匙圈。暫時鑰匙圈使用空密碼,依賴私密目錄的作業系統存取控制,就像匯入時使用的短期 PEM 材料一樣。
此第一版介接器接受單一 .app 及不含符號連結的內嵌 frameworks/dylibs。巢狀 .app、.appex 及 .xpc 套件會被拒絕,因為它們需要自己的描述檔及 entitlements。這些產品,以及 IPA 封裝與分發,請使用 Xcode archive/export。程式碼簽章驗證不會證明 Apple 的佈建或商店檢查將接受該產物。此介接器無法在 Windows/Linux 使用,且仍需要在 macOS 簽署主機上驗證。
安全性與限制
核准摘要繫結公開計畫、保管庫、憑證參照,以及具有領域分隔的 SHA-256 輸入/工具指紋。對目錄而言,指紋也包含排序後的項目名稱及結構。每次啟動前都會重新檢查工具檔案,複製的輸入也必須符合已核准的指紋。所選工具鏈及其相依項目必須受信任:工具可以讀取注入的憑證,並保有一般作業系統存取權。這不是程序沙箱、HSM、PKCS#11 提供者,也不提供與以您的作業系統使用者身分執行之其他程序的隔離。
在 Unix 上,暫存目錄/檔案僅擁有者可存取。在 Windows 上,工作區使用受保護、僅擁有者可存取的 DACL,憑證檔案會繼承此 DACL。密碼及金鑰絕不插入引數。由於原生工具需要,它們會暫時以檔案形式存在。正常完成/失敗會移除工作區;當機或斷電可能留下明文。不保證安全刪除。工具 stdout/stderr 會被抑制;簽署/加密結果,以及明確要求解密的輸出,會發布至所選本機目的地。
既有輸出絕不覆寫。檔案輸出以原子方式發布;應用程式目錄發布在複製期間可能被觀察到,若複製失敗則會移除。輸入/輸出限制為 2 GiB,每棵目錄樹最多 20,000 個項目,並拒絕符號連結/重新剖析點。最多允許 32 個工具步驟及 16 個憑證繫結。與 memories run 相同,執行時持有常駐程式寫入鎖,且只會終止直接逾時的程序;受信任工具的子孫程序一般不受限制。意圖與結果都會接受稽核,不包含機密值。