【Windows対応】GitHubでメインアカウントとサブアカウントで複数の SSH 鍵ファイルを使い分ける方法

目次

方法 1: ~/.ssh/config で切り替える

configファイルを作成します

設定ファイルの場所
Windows の OpenSSH は以下を参照します:
C:\Users\<ユーザー名>\.ssh\config
ない場合は、ファイルを新規作成してください。

複数の鍵を登録する例
GitHubでメインアカウントとサブアカウントで複数の SSH 鍵ファイルを使い分ける例

# メインアカウント用
Host github.com
  HostName github.com
  User git
  IdentityFile C:\Users\<ユーザー名>\.ssh\id_ed25519
  IdentitiesOnly yes

# サブアカウント用
Host github.com-name
  HostName github.com
  User git
  IdentityFile C:\Users\<ユーザー名>\.ssh\id_ed25519_name
  IdentitiesOnly yes

# サブアカウント用
Host github.com-sub
  HostName github.com
  User git
  IdentityFile C:\Users\<ユーザー名>\.ssh\id_rsa
  IdentitiesOnly yes
  • Host
    SSH接続時に使う接続名(エイリアス)を定義します。この名前を使って Git はどの設定を使うかを判断します。
  • HostName
    実際に接続するサーバーのホスト名(ドメイン名)です。
  • IdentityFile
    SSHで認証に使う秘密鍵ファイルのパスです。
    この鍵に対応する「公開鍵(.pub)」を GitHub 側の
    Settings → SSH and GPG keys に登録しておく必要があります。
  • IdentitiesOnly yes
    SSHが自動で他の鍵を試行しないようにする設定です。
    yes にすることで、この設定ブロックで指定した鍵だけを使うようになります。

コマンドプロンプトでアカウントを指定します

リモートURLを切り替える

メインアカウントの リポジトリの場合:
MAIN_USERはメインアカウント名、REPOは実際のリポジトリ名に変更してください。

git remote set-url origin git@github.com-main:MAIN_USER/REPO.git

サブアカウントの リポジトリの場合:
SUB_USERはサブアカウント名、REPOは実際のリポジトリ名に変更してください。

git remote set-url origin git@github.com-sub:SUB_USER/REPO.git

接続確認

先ほどの例の場合は、次のコマンドを実行します。
メインアカウントの場合:

ssh -T git@github.com

サブアカウントの場合:

ssh -T git@github.com-sub

次のようなコメントが表示されれば、正常に接続できています。

Hi <username>! You've successfully authenticated...

トラブルシューティング:接続確認でエラーメッセージが表示される

接続確認で次のようなエラーメッセージが表示される場合

Bad owner or permissions on C:\\Users\\ユーザー名/.ssh/config

config ファイルのアクセス権を修正します

PowerShell を「管理者として実行」して、次を実行してください:

icacls "%USERPROFILE%\.ssh\config" /inheritance:r
icacls "%USERPROFILE%\.ssh\config" /grant:r %USERNAME%:F

または、個別に記載したい場合は、ユーザー名の部分は、ご自身の環境に合わせて変更してください。

# 他のユーザーのアクセスを全削除
icacls "C:\Users\ユーザー名\.ssh\config" /inheritance:r
icacls "C:\Users\ユーザー名\.ssh\config" /grant:r ユーザー名:F
  • /inheritance:r = 権限の継承を外す
  • /grant:r ユーザー名:F = ユーザーにフルアクセスを付与

.ssh ディレクトリ全体の権限を見直します

icacls "%USERPROFILE%\.ssh" /inheritance:r
icacls "%USERPROFILE%\.ssh" /grant:r %USERNAME%:F

または、個別に記載したい場合は、ユーザー名の部分は、ご自身の環境に合わせて変更してください。

icacls "C:\Users\ユーザー名\.ssh" /inheritance:r
icacls "C:\Users\ユーザー名\.ssh" /grant:r ユーザー名:F

.ssh フォルダ以下の 全ファイル・サブフォルダを再帰的に 自分の所有に変更したい場合は

takeown /F "%USERPROFILE%\.ssh" /R /D Y
icacls "%USERPROFILE%\.ssh" /reset
icacls "%USERPROFILE%\.ssh" /inheritance:r
icacls "%USERPROFILE%\.ssh" /grant:r "%USERNAME%:(OI)(CI)F"

特徴

  • takeown /R : .ssh フォルダ以下の 全ファイル・サブフォルダを再帰的に 自分の所有に変更。
  • icacls /reset : フォルダ以下の ACL(アクセス制御リスト)を標準状態にリセット。
  • icacls /inheritance:r : 親フォルダ(C:\Users\ユーザー名)からの権限継承を切る。
  • grant:r "%USERNAME%:(OI)(CI)F" : 自分(ログイン中のユーザー)に フォルダと配下のファイル(OI=object inherit, CI=container inherit)へフルアクセスを再帰的に付与。

確認

icacls "%USERPROFILE%\.ssh\config"

結果が「ユーザー名:(F)」だけになっていればOKです。
再度、接続の確認を行います。

その他

今回は説明していませんが、次の方法もあります。

  • 方法 2: ssh-agent に都度追加して使い分ける
    • 同時利用する場合など
  • 方法 3: Git の core.sshCommand でプロジェクトごとに指定
    • リポジトリ単位で完全に分けたいなど
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

AIアーティスト | エンジニア | ライター | 最新のAI技術やトレンド、注目のモデル解説、そして実践に役立つ豊富なリソースまで、幅広い内容を記事にしています。フォローしてねヾ(^^)ノ

コメント

コメントする

目次