深夜2時の認証エラー
長いコーディングセッションを終え、いよいよ成果をプッシュする準備が整いました。いつものようにSSHキーをmacOSのKeychainにロードするためのコマンド、ssh-add -K ~/.ssh/id_ed25519を入力します。しかし、いつもの成功メッセージの代わりに、ターミナルには大量のテキストが表示されます。
ssh-add: illegal option -- K
usage: ssh-add [-cDlLqXx] [-t life] [file ...]
ssh-add -s pkcs11
ssh-add -e pkcs11
昨日までは動いていました。古いMacBookでも動いていました。しかし、macOS Monterey以降では、染み付いた習慣(マッスルメモリー)がエラーを引き起こします。これは、Appleが標準のOpenSSHとの互換性を保つために、独自のSSHフラグの動作を変更したことが原因です。
macOSで何が変わったのか?
AppleはmacOS Monterey (12.0) から、標準搭載のOpenSSHのバージョンを8.6p1にアップデートしました。このアップデート以前、Appleは-Kおよび-Aフラグを追加する独自のパッチを適用していました。これらは、macOSのKeychainとやり取りするために特別に用意された非標準のショートカットでした。
最新のOpenSSH標準に合わせるため、Appleはこれらのフラグの名前を変更しました。以前の-Kは--apple-use-keychainに、-Aは--apple-load-keychainになりました。古い1文字のバージョンを使用しようとすると、アップデートされたバイナリはそれを認識しません。些細な変更ですが、多くの開発者にとって長年の習慣を壊すものとなりました。
即効性のある修正(手動コマンド)
今すぐコードをプッシュする必要がある場合は、ロング形式のフラグを使用してください。-Kを新しい、説明的なバージョンに置き換えます:
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
注:古いRSAキーを使用している場合は、id_ed25519をid_rsaに置き換えてください。
同様に、再起動後にすべてのキーをエージェントに戻すために通常ssh-add -Aを実行している場合は、代わりに以下を使用してください:
ssh-add --apple-load-keychain
恒久的な修正(SSH設定)
ターミナルを再起動するたびに手動でコマンドを実行するのは時間の無駄です。より良い方法は、SSH設定ファイルを更新することです。これにより、サーバーに接続しようとするたびに、macOSが自動的にKeychainを確認するようになります。
- nanoやお好みのエディタでSSH設定ファイルを開きます:
nano ~/.ssh/config
- 以下の行を貼り付けます。この設定により、SSHがKeychainとエージェントの管理を自動的に処理するようになります:
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519
これらの行が実際に行うこと:
- AddKeysToAgent yes: キーを最初に使用したときに、自動的に
ssh-agentにロードします。手動でssh-addを実行する必要はもうありません。 - UseKeychain yes: これがmacOS特有の重要な設定です。パスフレーズをmacOSのKeychainに保存し、そこから取得するようにシステムに指示します。
- IdentityFile: 特定のキーのパスを指定します。異なる仕事用に複数のキーがある場合は、ここに複数の
IdentityFile行を追加できます。
- 保存して終了します(Ctrl+O、Enter、次にCtrl+Xを押します)。
設定のテスト
すべてが期待通りに動作しているか確認しましょう。まず、アクティブなエージェントを終了させて現在のセッションをクリアします:
killall ssh-agent
次に、GitHubに接続してみます:
ssh -T git@github.com
設定が正しければ、macOSのダイアログボックスが表示され、SSHパスフレーズの入力を求められます。**「パスワードをキーチェーンに保存」**というチェックボックスを必ずオンにしてください。一度これを行えば、二度と入力する必要はありません。
よくある落とし穴
厳格な権限設定: パーミッションが緩すぎると、SSHは設定ファイルを無視します。セキュリティ設定は厳格です。.sshフォルダとconfigファイルの所有権と権限が正しいことを確認してください:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/config
古いシェルのエイリアス: .zshrcや.bash_profileを確認してください。alias sload='ssh-add -K'のような古いエイリアスが残っていると、依然としてエラーになります。それらのエイリアスを--apple-use-keychainフラグを使用するように更新するか、設定ファイルが処理を代行するようになったので完全に削除してください。

