メールの暗号処理とアプリケーション署名
memories crypto は、暗号化された認証情報を信頼できるデスクトップ署名ツールと組み合わせて使用します。S/MIME と OpenPGP のメール操作、Android APK/AAB 署名、macOS でのプロビジョニング済み iOS .app の署名をサポートします。メールの送信やアプリの公開は行いません。これらの操作はターミナル sudo を使用してローカルデーモン経由で実行されます。MCP やモバイル FFI では利用できません。
これらのコマンドを使用する前に CLI とデーモンの両方を更新し、デーモンを再起動してください。古いデーモンは新しい操作を認識しません。
確認と実行
- 必要なツールをインストールし、署名用の ID とそのパスワードを別々の認証情報としてインポートします。
credential importはバイナリ PKCS#12/PFX と Android キーストアを受け付けます。パスワードには非表示入力を使用し、値を引数として渡さないでください。空パスワードの ID では、メール/iOS の--password_idを省略できます。 - 実行中のデーモンと同じ
--home/MEMORIES_HOMEを選択します。Memories が返す短いボールト ID と認証情報 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 の互換エイリアスです。3 つの表記はすべて同じ保存済み認証情報 ID を受け付けます。--tool NAME=PATH は明示的なパスで実行ファイルを選択します。複数のツールには繰り返し指定してください。例外は apksigner で、そのパスには SDK の lib/apksigner.jar を指定し、選択した Java ランタイムで実行します。ツールは別途インストールします。
出力は既存のディレクトリ内の新しいパスである必要があります。入力は非公開の作業領域にコピーされ、元の場所で署名されることはありません。ツールの出力は抑制されます。Memories はツール診断情報を公開せず、失敗したステップ番号を報告します。操作には 5 分の実行期限と、時間が制限されたクリーンアップがあります。
S/MIME
適切なメール保護用の証明書用途を持つ S/MIME ID を使用してください。Memories の TLS サーバー証明書は S/MIME ID ではありません。秘密鍵とその証明書を含む 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 アーマー形式またはバイナリの OpenPGP 秘密鍵エクスポートを ID としてインポートします。--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 は入力バイト列そのものに対するアーマー形式の分離署名を作成します。pgp-encrypt はアーマー形式の 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 マニフェストから取得します。AAB 署名は JDK の JAR 署名形式を使用し、jarsigner で結果を検証します。App Bundle の構造と Play のポリシーは、引き続きビルド/リリースパイプラインで検証されます。これらのコマンドは APK や AAB を生成せず、Google Play に接続しません。APK v4 の .idsig サイドカーファイルはエクスポートしません。
iOS(macOS のみ)
まず Xcode でデバイス用 .app をビルドしてください。一致する embedded.mobileprovision が含まれている必要があります。Apple 発行の署名用 ID を PKCS#12 としてインポートし、正確な証明書 SHA-1 フィンガープリントと一致するエンタイトルメントを指定してください。プロビジョニングプロファイル、チーム、アプリケーション識別子、デバイス、有効期限、エンタイトルメントが、意図したデプロイを許可する必要があります。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
ジョブは非公開の作業領域で ID を抽出し、そこに一時キーチェーンを作成し、選択した codesign 実行ファイル向けに ID をインポートします。埋め込みフレームワーク/dylib を内側から外側へ署名し、その後エンタイトルメントを付けてメインアプリを署名し、コード署名を検証します。処理後に一時キーチェーンを削除し、デフォルトのキーチェーンとしては選択しません。一時キーチェーンは空のパスワードを使用し、インポートに使用する短寿命の PEM データと同様に、非公開ディレクトリの OS アクセス制御に依存します。
この最初のアダプターは、シンボリックリンクを含まない単一の .app と埋め込みフレームワーク/dylib を受け付けます。入れ子の .app、.appex、.xpc バンドルは、それぞれ独自のプロファイルとエンタイトルメントが必要なため拒否します。それらの製品、IPA のパッケージング、配布には Xcode のアーカイブ/エクスポートを使用してください。コード署名の検証は、Apple のプロビジョニング検査やストアの審査が成果物を受け入れることを証明しません。このアダプターは Windows/Linux では利用できず、macOS の署名ホストでの検証が引き続き必要です。
セキュリティと制限
承認ダイジェストは、公開プラン、ボールト、認証情報の参照、ドメイン分離された SHA-256 の入力/ツールフィンガープリントを結び付けます。ディレクトリの場合、フィンガープリントには並べ替えたエントリー名と構造も含まれます。ツールファイルは起動ごとに再確認され、コピーされた入力は承認済みフィンガープリントと一致する必要があります。選択したツールチェーンとその依存関係は信頼できる必要があります。ツールは渡された認証情報を読み取ることができ、通常の OS アクセス権も保持します。これはプロセスサンドボックス、HSM、PKCS#11 プロバイダー、または同じ OS ユーザーとして実行される他のプロセスからの隔離を提供するものではありません。
Unix では一時ディレクトリ/ファイルは所有者のみがアクセスできます。Windows では、作業領域は所有者のみを許可する保護された DACL を使用し、認証情報ファイルがそれを継承します。パスワードと鍵が引数に埋め込まれることはありません。ネイティブツールが必要とするため、一時的にファイルとして存在します。正常終了/失敗時には作業領域を削除しますが、クラッシュや電源断により平文が残ることがあります。安全な削除の保証はありません。ツールの stdout/stderr は抑制されます。署名済み/暗号化された結果と、意図的に復号された出力は、選択したローカル出力先に公開されます。
既存の出力は上書きしません。ファイル出力はアトミックに公開されます。アプリディレクトリの公開はコピー中に観測でき、コピーに失敗した場合は削除されます。入力/出力の上限は 2 GiB、ツリーあたり 20,000 エントリーで、シンボリックリンク/再解析ポイントは拒否されます。ツールステップは最大 32、認証情報のバインドは最大 16 です。memories run と同様に、実行中はデーモンの書き込みロックを保持し、タイムアウト時は直接のプロセスのみを終了します。信頼されたツールの子孫プロセスは通常、封じ込められません。意図と結果は秘密の値を含めずに監査されます。