nix-secure-enclave-keyを作った

25 Aug 2026 ・ 10 min read ・


Note

mizdraさんの​blogを​読んで​一瞬で​作った​ものの、​旅行等々​ありblogが​遅れてしまった

久しぶりに​wrapperでもなく​ただただ​自分の​ために​めちゃくちゃ​便利な物を​作ったので​紹介。

GitHub - ryoppippi/nix-secure-enclave-key: Nix-packaged Secure Enclave-backed SSH authentication and Git SSH signing for macOS.
Nix-packaged Secure Enclave-backed SSH authentication and Git SSH signing for macOS. - ryoppippi/nix-secure-enclave-key
GitHub

Secretiveは​最高だが​辛い

Apple製品が​搭載する​セキュリティコプロセッサSecure Enclave上で​SSH秘密鍵を​生成&格納し、​ssh-agentのように​動作する​macOS用アプリ。​秘密鍵は​仕組み上取り出せないので​セキュアな​運用が​可能。​いいね。​ / “GitHub - maxgoedjen/secretive: Store SSH keys in the Secure E…​” htn.to/3qSCXWvike

Reply

自分は​git commitの​署名や​ssh keyの​管理にSecretiveを​使って​なんだかんだ​4年くらいが​経った。

基本的に​自分は​private keyを​極力管理したくない。~/.sshに​置いたりするのは​論外だし、​1Passwordに​登録すると​しても​一度​generateするのが​面倒である。

Secretiveとは、​macOSの​Secure Enclaveを​使って​ssh keyや​gpg keyを​管理する​ツールである。​keyを​生成すると​private keyは​Secure Enclaveに​格納され、​自分を​含め誰も​keyに​アクセスする​ことができない。​つまり、​private keyが​漏洩する​心配が​ない​!!最高! Secretive appに​表示される​public keyを​GitHubや​remote serverに​登録する​ことで、​その​マシンから​のみ​署名や​ssh接続が​可能に​なる。​最高である。

基本的には​この​コンセプトが​大好きで​ずっと​使ってきたが、​不満が​ないわけでもなかった。

  • Secretive Appから​ Port に​よる​接続が​必要なのだが、​GUIが​よく​死んでいる​ことが​あり、​そこで​署名が​詰まる
  • Login状態で​のみ​署名が​可能なので、​一度​macが​sleepすると​署名が​できず、​coding agentと​相性が​すこぶる​悪い
  • Secretiveは​GUIアプリであり、​CLIから​操作できない
    • 毎回​マシンを​セットアップする​際に​マウスで​ぽちぽち、​GitHub Configを​開いて​ポチポチ、がだる​すぎる
    • 仕事と​privateの​マシンで​どっちも​あるとだる​い
    • 転職が​多い​人間に​とって​大変....
    • 設定が​ Declarativeでない

特に​ほぼ全ての​設定をdotfiles で​管理している​自分に​とって、​Secretiveの​設定を​管理できないのは​苦痛で​仕方なかった。​ CLIに​ついては​issueが​長らく​存在しているが進む気配もなさそうである。

救世主mizdra、​そして​ sc_auth create-ctk-identity

8月頭に​ MIZDRA さんが​書かれていた​記事の​中で、​Secure Enclave 内に​鍵を​生成する​CLIが​ある​ことが​紹介されていた。

Secure Enclave で​ git commit の​署名鍵を​管理する​ - mizdra's blog
id:mizdra は​ Git の​ commit 署名を​していて、​その​署名鍵を​ 1Password で​管理している。​commit を​する​度に​ 1Password に​よる​生体認証を​求められるが、​その​分安全に​署名鍵を​扱える。​ 今までは​それで​不満は​無かったのだけど、​Coding Agent を​使うようになってからと​いう​もの、​この​仕組みが​足かせに​なっている。​具体的には、​Coding Agent に​タスクを​投げて​人間が​他の​ことを​している​際に​ commit が​試行され、​人間が​時間内に​生体認証できずタイムアウトする、と​いう​もの。​これの​せいで、​「人間は​これから​寝るから​これやっておいて!」と​投げた​タスクが​途中で…
mizdra's blog

詳しくは​記事に​譲ると​して、

sc_auth create-ctk-identity -l git-sign -k p-256-ne -t none

で​keyを​生成する​ことができる。​また、-t optionで​認証の​有無まで​指定できる。​ これで​CLIから​Secure Enclave内に​keyを​生成する​ことができるようになった。

しかし、​この​blog記事の​手順を​毎回​手作業で​実行したり、~/.ssh/configgitconfig、​GitHubの​設定を​手作業で​行うのは​面倒である。​と​いうかだる​すぎる。​ 自分は​dotfilesを​nix&nix-darwinで​管理している。​その​ため基本はgit cloneしてnix run .#switchを​するだけで​セットアップが​完了する。​ ssh keyも​その​仕組みに​乗っかって​ほしいのだが、​これを​実現している​OSSは​存在しなかった。​と​いうわけで​ nix-secure-enclave-key を​作った。

nix-secure-enclave-keyの​何が​嬉しいのか

手作業からの​解放!​全て​nixで​宣言的に​管理できるのが​本当に​嬉しい。

  • nix run .#switchで​Secure Enclaveの​identity生成、​ssh config、​gitconfigまで​終わる
  • 認証済みのghが​あれば、gh ssh-key addで​GitHubの​authentication keyと​signing keyも​登録できる
  • 同じ​dotfilesを​Mac間で​同期しつつ、​鍵は​各Macの​Secure Enclaveに​固有の​ものを​作れる
  • 署名用は​Touch IDなし、​リモートサーバー用は​Touch ID​あり、と​identityを​用途別に​分けられる

Secure Enclaveの​鍵を​declarativeに​管理できるように​したのが、​この​projectの​新しい​ところである。

仕組み

この​moduleが​やる​ことは​単純である。

  1. sc_authで​Secure Enclaveの​identityを​作る
  2. その​identityに​対応する​SSHの​stub/referenceを~/.sshに​置く
  3. SSHと​Gitに​そのファイルと​providerを​設定する

~/.ssh/id_enclave_keyに​秘密鍵が​入るわけではない。​秘密鍵は​Enclaveから​出ず、​ファイルには​対応する​identityを​呼び出すための​情報だけが​入る。​だから​同じ​identityを​GitHubへの​SSH認証、​commit署名、​サーバーへの​ログインに​使える。

activationで​鍵を​扱う

生成の​たびに​固有の​値を​持つ鍵その​ものは​Nixに​書けない。​宣言できるのは​「この​labelの​identityが​存在して​ほしい」と​いう​状態までである。​activationは​identityと​stubを​確認し、​なければ​作るensureと​して​動く。​既存の​鍵は​削除しない。

nix-darwinの​activationは​rootで​動くので、​そのまま​鍵を​作ると​rootの​identityに​なる。​Secure Enclaveの​鍵は​ログインユーザーに​紐づく​ため、​moduleはsystem.primaryUserで​指定された​ユーザーと​して​identityの​作成と​Gitの​設定を​実行する。

GitHubへの​登録にはgh ssh-key addを​使う。github.autoAddを​有効にし、​初回だけghに​必要な​scopeを​追加する。

gh auth refresh --hostname github.com --scopes admin:ssh_signing_key,admin:public_key

scopeが​足りない​場合は​activationを​止めず、​手動実行用の​コマンドを​表示する。

宣言を​Mac間で​同期する

dotfilesで​同期するのは​鍵その​ものではなく、​label、​用途、​protectionなどの​宣言である。​各Macでは​固有の​identityを​作り、​GitHubの​titleに​Mac名と​fingerprintを​入れて​区別する。

設定例

実際に​自分のdotfilesで​使っている​設定は​以下の​通り。

{
  programs.nix-secure-enclave-key = {
    enable = true;
    identities = {
      git-signing = {
        keyFile = "~/.ssh/id_enclave_key";
        label = "nix-secure-enclave-key";
        protection = "none";
        autoEnsure = true;
        github = {
          autoAdd = true;
          type = "both";
        };
      };
    };
    signingIdentity = "git-signing";
    signByDefault = true;
  };
}

その​他の​設定例はREADMEを​参照して​ほしい。

Secretiveから​移行する​場合は​repositoryに移行ガイドを​置いてあるので、​AIに​読ませて​移行を​頼むと​よい。

まとめ

2週間ぐらい​運用してるが、​特に​問題なく​動いている。​ Secretive Appを​使っていた​時のように​たまに​hangしたり、​logoutで​git commitできない、と​いう​問題が​消えて​快適である。​ また、​sshで​remote loginする​ときも、​touch idや​apple watchで​認証してくれる​安全性は​そのまま​享受できていて、​求めて​いた​ものと​いう​感じで​最高。

捕捉

ryoppippi調査に​よれば、​この​辺りは​ SeKey → Secretive → sc_auth → mizdraさんの​記事 → nix-secure-enclave-key と​いう​系譜に​なっている。​詳しく​気に​なる​人は​以下の​promptを​AIに​投げて​調べて​もらうと​よい。

SeKey → Secretive → sc_auth → mizdraさんの記事 → nix-secure-enclave-key の流れを説明してください。加えて、nix-secure-enclave-keyの新規性がどこにあるのかも教えてください。
comment on bluesky / twitter