好久沒發網誌,一發網誌立刻收到 GitHub 的通知,說它們即將在明年廢除 https 上 code 的方式,也就是輸入帳密的方式。只好鼻子摸摸來改成使用 SSH 金鑰了。
[GitHub] Deprecation Notice
Basic authentication using a password to Git is deprecated and will soon no longer work. Visit https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information around suggested workarounds and removal dates.
之前在使用 SSH Key-based 登入時,有稍微提過 SSH 認證與設置的步驟,在這邊的流程也不例外:
我習慣所有的金鑰對收集起放在 ~/.ssh
這個目錄下。若該目錄不存在,就自己建一個,並設定正確的權限:
然後使用 ssh-keygen
這個指令產生金鑰,依照教學文件的提示,我們選擇 ED25519 作為金鑰的加密演算法,並使用電子郵件作為標籤,創建一個新的 SSH 金鑰。
不過,ED25519
是後來推出的加密演算法,可能會發生舊系統無法生成的狀況。因此若系統不支援,可以改用 rsa
,並指定金鑰長度為 4096
:
這邊稍微補充下,在 ssh-keygen
中常用參數如下:
-t
:指定金鑰的加密演算法,預設使用 SSH2d
的 rsa
。-f
:指定金鑰的檔名,預設檔名會隨演算法而變動,例如使用 rsa
加密時,其檔名預設為 id_rsa
(私鑰id_rsa
,公鑰id_rsa.pub
)。這階段沒改沒關係,等等還會在詢問。-P
:提供舊密碼,空表示不需要密碼(-P ‘’)-N
:提供新密碼,空表示不需要密碼(-N ‘’)-b
:指定金鑰長度(bits)。-C
:提供一個新標籤。在產生金鑰的過程中,會詢問 3 個問題,如果沒有特殊需求可以全部使用預設值(按 Enter)就好:
Enter file in which to save the key
第 1 個問題是問你金鑰儲存的位置與檔名,預設檔名是前面所提到 id_ed25519
。不過,這命名無法表明金鑰的用途,所以習慣上我會更改檔名,例如 github_key
。
Enter passphrase / Enter same passphrase again
第 2 跟 3 個問題則是詢問是否指定金鑰保護密碼,若有設定密碼的話,之後使用每次使用時,這把金鑰時就要輸入密碼,因此請務必牢記,不然這把金鑰就廢了 XDDD
如果之後想修改金鑰密碼的話,可以透過 ssh-keygen
來設定。
完成上述設定後,會看到 fingerprint 與 randomart ,就代表產生成功了
這個步驟是給有設定金鑰密碼的人,如果你有設定密碼,但又不想每次使用金鑰就要輸入一次,你可以考慮設定金鑰代理:
如果你沒有設定密碼,或是像我一樣不想起一個 agent 在背景跑,寧願每次輸入密碼的,可以跳過這個步驟。
產生的金鑰有兩把,一把是公鑰(Public Key)、一把是私鑰(Private Key)。
知道要上傳的是那把鑰匙後,就可以依照下列方式進行設定
檢視並複製生成的公鑰:
新增金鑰:
接下來登陸你的 GitHub 帳號,點選你的頭像 → Settings
。
左欄點選 SSH and GPG keys
→ New SSH key
。
最後把剛剛複製下來的公鑰,貼在下方,並為這把金鑰取個方便管理的名字。
連線測試
完成金鑰上傳後,驗證下這組金鑰是不是正常工作,如果一切正常,應該會看到下面的訊息:
不過,很不幸的我看到是這樣:
看起來被拒絕了。因為沒有足夠的資訊可供參考,所以我加上的 -v
,試圖獲取多的資訊:
發現它在連線測試的時候,使用的預設的檔名,但我剛剛在建立金鑰時,更改了金鑰的名稱,難怪找不到,這時必須在配置一個 config
檔:
在檔案中加上下列內容,其中 IdentityFile 是我們剛剛建立的金鑰:
保存後重新測試連線,Bingo!
完成金鑰的產生與配置後,必須更改連線的協議,否則即便配置 SSH,還是會走 https 的傳輸協定。
說是更改連線協議,不過這其實就是更換遠端伺服器倉庫網址,Github 對於不同的協定走的是不同的伺服器倉庫網址。因此網址會從 https 改成 git 開頭:
完整的指令如下:
是也可以修改 config 檔案來達成該換遠端伺服器倉庫,不過個人偏愛指令的設定方式。
完成後,可以試著上傳 commit,並查看金鑰的使用狀況,應該會發現金鑰有了使用紀錄:
基本上所有動作跟在 Linux 一樣,唯一的差異就是在 SSH 金鑰存放的位置是在 c:/Users/user_name/.ssh
。
本文作者: 辛西亞.Cynthia
本文連結: 辛西亞的技能樹 / hackmd 版本
版權聲明: 部落格中所有文章,均採用 姓名標示-非商業性-相同方式分享 4.0 國際 (CC BY-NC-SA 4.0) 許可協議。轉載請標明作者、連結與出處!