1. 程式人生 > 其它 >Git&GitHub 03 用 SSH 協議連結遠端儲存庫

Git&GitHub 03 用 SSH 協議連結遠端儲存庫

注意事項與宣告

平臺: Windows 10

作者: JamesNULLiu
郵箱: [email protected]
部落格: https://www.cnblogs.com/jamesnulliu

學習筆記 轉載請註明出處 歡迎留言

0. 前言

本系列文章是 git & github 的入門教程.
本系列文章優勢:

  1. 零基礎
  2. 深入淺出
  3. 知識點涵蓋面廣

本系列其他文章的連結

儘管如此, 想要真正學會 git & github 建議不要看任何教程, 直接看 git 的 官方文件.


1. 為什麼使用 SSH protocol

主系列教程中, 我們使用 HTTPS 協議 連線遠端倉庫.
HTTPS 協議

是目前比較受使用者青睞的連線方式, 用以下命令可以檢視到當前 origin 指向的是以 https 開頭的 URL:

git remote -v

HTTPS 與 SSH 都是一種安全的網路連線協議:

  • 使用 HTTPS 協議對遠端倉庫操作需要提供使用者的賬號和密碼 (沒有提示輸入是因為 git 儲存了你的賬號密碼);
  • 使用 SSH 協議對遠端倉庫操作, 首先需要匹配儲存在電腦中的私鑰, 其次如果使用者對私鑰設定了密碼, 還需提供該密碼.

對於公開的專案, 用何種協議或許無關緊要;
但對於私有的 (或團隊管理) 的專案, 我們應該選擇一種更加安全的資訊保護措施.
相較 HTTP, HTTPS 已經足夠安全; 但由於 SSH 基於 非對稱加密技術

, 它的安全性又更勝一籌.

2. 刪除 SSH keys

在某些情況下, 如果繫結的金鑰出現問題, 我們需要需要刪除它.
後續節中, 如果發現金鑰出問題, 請回到這步刪除你的金鑰.

  1. 進入儲存了金鑰的資料夾 (預設在 C:/Users/你的使用者名稱/.ssh/ );
  2. 刪除出現問題的金鑰對(一個沒有後綴名的檔案(private key) 和 一個同名但字尾名為.pub的檔案(public key));
  3. 刪除 known_hostsknown_hosts.old (如果有);
  4. 如果有 config 檔案, 用記事本開啟, 刪除其中出現問題的金鑰配置;
  5. 登入 github 賬號, 在 Settings
    頁面左側欄中找到 SSH and GPG keys, 刪除已有的 ssh 金鑰.

3. 建立 SSH keys

在 git 中存在兩種演算法生成金鑰, 一種是 rsa, 另一種是 ed25519.
ed25519 是一種 ECC 演算法, 比起傳統的 rsa 更加現代化和高效.
因此推薦使用 ed25519 演算法生成金鑰.

  1. 在任意位置右鍵開啟 git bash, 在終端輸入以下命令 (建議將引號內內容替換為自己的郵箱):
    ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/my_github_ed25519
    
    • ssh-keygen 表示生成 ssh 金鑰;
    • -t ed25519 表示使用 ed25519 演算法; 如果使用 rsa 演算法, 建議輸入 -t rsa -b 4096, 即生成 4096 bits 的金鑰;
    • -C "comments" 是對該金鑰的說明, 引號內可以填寫郵箱或者任何文字;
    • -f ~/.ssh/my_github_ed25519 指出了金鑰的生成路徑以及金鑰的檔名, 檔名可以依據自己的需求更改, 金鑰可在 C:/Users/你的使用者名稱/.ssh/ 資料夾內找到.
  2. 接著終端提示設定密碼, 當遠端的公鑰與電腦的私鑰匹配後, 使用者希望進一步操作則需要輸入密碼.
    強烈建議設定密碼, 但請確保自己記得住該密碼.
    在你輸入密碼時, 終端的介面上不會顯示出白色的密碼字元, 這是對周圍環境的防範.
  3. 再次輸入與剛剛相同的密碼, 匹配成功後顯示金鑰成功生成, 並輸出了金鑰的指紋和隨機影象. 可以忽略這些內容;
  4. 進入 C:/Users/你的使用者名稱/.ssh/ 資料夾 (沒有就自己建立一個), 右鍵新建文字文件, 取名為 "config" (不要保留.txt字尾名);
    右鍵選擇用記事本開啟, 在裡面輸入以下內容 (最後一行是金鑰路徑和檔名, 注意根據自己的情況更改):
    Host github.com
    Hostname github.com
    # ProxyCommand connect -S 127.0.0.1:7890 %h %p
    User git
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/my_github_ed25519
    
    • 關於 Host 和 Hostname
      Host 是別名, Hostname 是域名;
      例如命令 ssh -T [email protected]github.com 是 Hostname;
      如果將 Host 設定為 github, 那麼只需輸入 ssh -T github 就行;
      但此時輸入 ssh -T [email protected] 會出錯,
      因此務必統一將 Host & Hostname 設定為 github.com 以避免莫名其妙的錯誤.
    • 關於 Proxy
      上文給出的配置命令中用 # 註釋掉了 ProxyCommand, 如果希望配置代理, 請刪除 # 並按照以下規則改動命令和埠:
      SOCKS代理: ProxyCommand connect -S localhost:1080 %h %p
      HTTP代理: ProxyCommand connect -H localhost:1080 %h %p
      注: 本文是基於windows平臺撰寫的, 上述代理方式使用了 Git for Windows 同捆的 connect.exe. 如果是 Linux 平臺, 需要額外安裝 connect-proxy.
    • 關於 127.0.0.1 和 7890
      127.0.0.1 指本地ip地址, 7890 指代理的埠.

4. 連線到 Remote Repository

  1. 進入儲存了金鑰的資料夾 (預設在 C:/Users/你的使用者名稱/.ssh/ ),
    用記事本開啟剛剛建立的金鑰對的公鑰 (你取的檔名.pub),
    複製裡面的所有內容.
  2. 登入 github 賬號,
    Settings 頁面左側欄中找到 SSH and GPG keys,
    點選右側按鈕 New SSH key,
    隨便取個 Title,
    在 Key 的輸入框中貼上剛剛複製的公鑰.
  3. 在任意位置右鍵開啟 git bash, 在終端輸入以下命令:
    ssh -T [email protected]
    
    終端提示輸入密碼, 如果是新的金鑰, 成功後會提示該沒要還沒被授權, 提問是否授權;
    輸入 yes, 成功後會有類似於: Hi jamesnulliu! You've successfully authenticated, but GitHub does not provide shell access. 的提示;
    如果終端提示: [email protected]: Permission denied (publickey)., 那請檢查 第3節第4步 中的 config 檔案 是否配置正確, 如果還是不行就回到 第2節 刪除 ssh key 重新來過.
  4. 再次輸入以下命令:
    ssh -T [email protected]
    
    輸入密碼後終端給出類似於 Hi jamesnulliu! You've successfully authenticated, but GitHub does not provide shell access. 的提示, 說明金鑰連線成功.

5. 用 SSH protocol 進行專案管理

5.1. New Repository

和 HTTPS 協議唯一不同的地方在於, 在 github 上覆制專案連結的時候選擇 HTTPS 旁邊的 SSH, 點小方塊複製連線.

在外部資料夾使用以下命令 clone 儲存庫 (更換為你的儲存庫連結):

git clone [email protected]:jamesnulliu/test.git

clone 完成後將工作區切換到 clone 下來的資料夾 (本地儲存庫) 內, 在終端輸入以下命令:

git remote -v

可以看到現在 origin 指向的已經是 ssh 協議的連結了.

5.2. 更改已有 Local Repository 的連線方式

git remote -v 檢視本地儲存庫連結方式;
如果本地儲存庫已經用 https 協議連結, 請遵輸入以下命令更改 origin 指向的 URL (xxx 替換成 ssh 連線地址).

git remote set-url origin xxxxxxx

參考:
[email protected]: Permission denied (publickey)
Git SSH金鑰刪除與建立
HTTPS vs SSH in git
使用 Ed25519 演算法生成你的 SSH 金鑰
詳解:為GitHub、Gitlab賬號同時新增、管理多個SSH-Key
How to set SSH on GitHub using Ed25519 algorithm in Colab?