GitHubにおけるHTTPS接続とSSH接続の使い分け
GitHubのリモートリポジトリにアクセスするにはHTTPS接続とSSH接続がある。この2つの特徴をまとめると以下のようになる。
項目 | HTTPS接続 | SSH接続 |
---|---|---|
通信速度 | SSHより若干遅い | HTTPSよりも若干速い |
安定性 | SSHより若干不安定 | HTTPSよりも若干安定(特に大規模リポジトリの操作) |
メリット |
|
|
デメリット |
|
|
使いどころ |
|
|
結論
- 簡単に使いたい or 企業のネットワークで使うならHTTPS
- 頻繁に使う or セキュリティを重視するならSSH
WindowsでSSHキーを発行する時の留意点
- SSHキーを発行する際はGit Bashを使うのが便利。(GitBashはGitをインストールすると一緒にインストールされる)
- 発行されたSSHキーはデフォルトで「C:\Users\ユーザ名.ssh」フォルダに配置される
SSHキーの発行
Git Bash
# ダブルクオテーションなくても良い。
# 入力する文字列の中で半角スペースがある際にダブルクオテーションで囲めば半角スペースも認識してくれる。
# ダブルクオテーション入力を常習化しておいた方が良い
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# Generating public/private rsa key pair.
# sshキーの作成場所を指定。デフォルトで良いならそのままEnter
# 変更例①:D:/key/id_rsa
# 変更例②:D:/key/sample (sampleという名前の鍵ができる)
Enter file in which to save the key (/c/Users/ユーザ名/.ssh/id_rsa):
# パスフレーズ(SSHキーのパスワード)を指定。
# SSHキーが漏洩してもパスフレーズあれば安心。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
# Your identification has been saved in /c/Users/ユーザ名/.ssh/id_rsa
# Your public key has been saved in /c/Users/ユーザ名/.ssh/id_rsa.pub
# The key fingerprint is:
# SHA256:ーーー your_email@example.com
# The key's randomart image is:
# +---[RSA 4096]----+
# | . |
# | . o |
# | . = o |
# | o + + . |
# |. o o + S . o |
# |.+ = * o . . o |
# |+ + E =.. o o . |
# | =.+ o o+ ..o o |
# |..+.o==o+=o.+= |
# +----[SHA256]-----+
SSHキーをSSHエージェントに追加
SSHエージェント
SSHキーの管理と認証を簡単にするためのプログラム。
SSHエージェントは、SSHキーをメモリに保持し、SSH接続を行う際に自動的にキーを提供することで、パスフレーズの再入力を省略できる。
SSHエージェントの機能
- SSHキーの管理:複数のSSHキーをメモリに保持し、適切なキーを簡単に使える
- パスフレーズのキャッシュ:パスフレーズを設定している場合、最初にSSHキー追加の時にパスフレーズを入力する。それ以降、SSHエージェントがキーとパスフレーズをキャッシュするため、再度パスフレーズを入力する必要がなくなる
- 自動認証:SSH接続する際にSSHキーを自動で設定する
Git Bash
# SSHエージェントの起動
eval "$(ssh-agent -s)"
# SSHキーをSSHエージェントに追加
ssh-add ~/.ssh/id_rsa
公開キーをコピー
Git Bash
# 公開キーを表示する
cat ~/.ssh/id_rsa.pub
# 表示されたid_rsa.pubの中身の内メールアドレス以外をコピーする
# 例えば公開鍵の内容が次のような場合、コピー対象は「ssh-rsa AAACSfNxxxxxxxxxxxxxxxx==」
# (メールアドレス直前の半角スペースはコピー不要)
# ssh-rsa AAACSfNxxxxxxxxxxxxxxxx== your_email@example.com
公開キーをGithubに登録する
1.GitHubの右上にあるプロフィールアイコンをクリックし、「Settings」を選択
2.左側のメニューから「SSH and GPG keys」を選択
3.「New SSH key」ボタンをクリックする。
4.「Title」にキーの名前を入力し、「Key」に先ほどコピーした公開キーの内容を貼り付ける。
5.「Add SSH key」ボタンをクリックしてキーを追加する。
SSH接続テスト
Git Bash
# SSHエージェントが正しく設定されているか確認するために、GitHubへの接続をテスト
ssh -T git@github.com
# 正常に接続できると以下メッセージが表示される。
# Hi xxxxx! You've successfully authenticated, but GitHub does not provide shell access.
SSHでクローン
1.GitHubのリポジトリページの「Code」ボタンをクリックし、SSHのURLをコピー
2. Git Bash上で以下コマンドを実行。
Git Bash
# 前提:クローンしたいフォルダに移動した状態で実行
git clone git@github.com:your-organization/internal-repo.git
SSHでpush
ssh接続でpushする場合は、事前にgit remote set-urlコマンドを使い、pushする先のリモートリポジトリURLをSSH用のURLに変更する必要がある。
今回の場合、リモートリポジトリURLをhttps://github.com/xxx/sample.git(https接続)
からgit@github.com:xxx/sample.git(SSH接続)
に変更する
Git Bash
# 現在のリモートリポジトリURLを確認する
# origin https://github.com/xxx/sample.git (fetch)
# origin https://github.com/xxx/sample.git (push)
git retemo -v
# originのリモートURLをssh用のURLに変更する
git remote set-url origin git@github.com:xxx/sample.git
# 再度、現在のリモートリポジトリURLを確認する
# 以下のようにSSH用のURLになっていればSSHでpushする準備はOK
# origin git@github.com:xxx/sample.git (fetch)
# origin git@github.com:xxx/sample.git (push)
git retemo -v
発生したエラーと対応方法
Permission denied (権限がない)
エラー内容
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
原因
Githubに公開鍵の内容登録をしていない。もしくは、GitHubに登録したSSH公開鍵の内容が間違っている場合に発生する。
一度登録した公開鍵は編集ができないので、新しく公開鍵を登録すれば良い
ERROR: Repository not found.(リポジトリが見つからない)
エラー内容
ERROR: Repository not found.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.