From 32ed7f5d01a48e6d960c60d4848ff1360644cecf Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Sun, 30 Aug 2026 05:05:32 +0900 Subject: [PATCH] =?UTF-8?q?dotfiles:=20GitHub=20=E8=AA=8D=E8=A8=BC?= =?UTF-8?q?=E3=83=BB=E7=BD=B2=E5=90=8D=E3=82=92=20Secure=20Enclave=20SSH?= =?UTF-8?q?=20=E3=82=AD=E3=83=BC=E3=81=AB=E7=A7=BB=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 1Password SSH エージェントから macOS Secure Enclave 管理の SSH キーへ移行 - commit 署名は ~/.ssh/id_github_se を使うように変更 - push 認証も Host github.com で Secure Enclave キーを使用 - SSH_SK_PROVIDER を fish セッション変数に設定 --- home-manager/programs/fish/default.nix | 3 +++ home-manager/programs/git/default.nix | 18 ++++++++++++++++-- home-manager/programs/ssh/default.nix | 12 +++++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/home-manager/programs/fish/default.nix b/home-manager/programs/fish/default.nix index f53de048..e95fa925 100644 --- a/home-manager/programs/fish/default.nix +++ b/home-manager/programs/fish/default.nix @@ -7,6 +7,9 @@ { imports = [ ./common.nix ]; + # Secure Enclave に格納した SSH キーを認証・署名に使うためのプロバイダー。 + home.sessionVariables.SSH_SK_PROVIDER = "/usr/lib/ssh-keychain.dylib"; + programs.fish = { functions = { scc = { diff --git a/home-manager/programs/git/default.nix b/home-manager/programs/git/default.nix index 04023654..6d4ccda1 100644 --- a/home-manager/programs/git/default.nix +++ b/home-manager/programs/git/default.nix @@ -5,6 +5,18 @@ programs.gpg.enable = true; + # Secure Enclave に格納した SSH キーを git commit 署名に使う。 + # キーハンドルファイルは各 Mac で `sc_auth create-ctk-identity` + # を使って生成する必要がある。 + home.file.".local/bin/ssh-sign" = { + executable = true; + text = '' + #!/bin/sh + export SSH_SK_PROVIDER=/usr/lib/ssh-keychain.dylib + exec /usr/bin/ssh-keygen "$@" + ''; + }; + # Cloudflare Access (Forgejo CLI) の Service Token を含む git の include ファイルを # sops で暗号化して管理する。home-manager の activation で復号され、 # ~/.config/git/cloudflare-access.gitconfig に symlink される。 @@ -17,7 +29,9 @@ programs.git = { signing = { format = "ssh"; - key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILQwsbXl/1tHIdW/f+fZE7TJArqzvmbbaUsdKRFPoyZB"; + # Secure Enclave 内の SSH キーハンドルを指す。 + # 対応する公開鍵は ~/.ssh/id_github_se.pub に置く。 + key = "~/.ssh/id_github_se"; signByDefault = true; }; settings = { @@ -36,7 +50,7 @@ }; gpg = { ssh = { - program = "/Applications/1Password.app/Contents/MacOS/op-ssh-sign"; + program = "${config.home.homeDirectory}/.local/bin/ssh-sign"; }; }; # forgejo.thinceller.dev (Forgejo) は Cloudflare Access で保護されているので、 diff --git a/home-manager/programs/ssh/default.nix b/home-manager/programs/ssh/default.nix index 8fbbf671..6064aaec 100644 --- a/home-manager/programs/ssh/default.nix +++ b/home-manager/programs/ssh/default.nix @@ -18,6 +18,16 @@ # settings は freeform で OpenSSH のディレクティブ名を直接キーに使う (旧 matchBlocks)。 settings = { + # GitHub は Secure Enclave に格納した SSH キーで認証・署名する。 + # キーハンドルファイルは各 Mac で作成する必要がある。 + "github.com" = { + HostName = "github.com"; + User = "git"; + IdentityFile = "~/.ssh/id_github_se"; + IdentitiesOnly = "yes"; + IdentityAgent = "none"; + }; + # admin 主経路: Tailscale (MagicDNS で tailnet IP に解決)。 # Tailscale SSH なので鍵認証は tailscaled が処理 (IdentityFile 不要)。 "oberon" = { @@ -25,7 +35,7 @@ User = "thinceller"; ServerAliveInterval = 60; }; - # fallback: cloudflared 経由 (Tailscale 故障時 / 経路系 deploy 時)。 + # fallback: cloudflared 経路 (Tailscale 故障時 / 経路系 deploy 時)。 "oberon-cf" = { HostName = "oberon.thinceller.dev"; User = "thinceller";