前言
有一個(gè)SSH
密鑰跟了我很多年,更換電腦也不曾更換它。它不需要額外輸入密碼就能用,我將它的公鑰用在了諸多平臺(tái)。雖然很方便,但是安全性差(指沒有密碼)和匿名性差(指同一公鑰在不同平臺(tái)可能被關(guān)聯(lián))。
于是,計(jì)劃在保留已有SSH
密鑰的情況下,先新創(chuàng)建一個(gè)SSH
密鑰專門用于GitHub
,并加上密碼增加安全性,后續(xù)再逐步為其他平臺(tái)創(chuàng)建。在實(shí)際操作過程中,遇到了一些問題并進(jìn)行研究,在此記錄一番,希望對(duì)你有所幫助。
注意,以下內(nèi)容均是以GitHub
使用SSH
連接為例,分別討論單個(gè)或多個(gè)SSH
密鑰的使用等問題。可能存在不完善或少許錯(cuò)誤,歡迎留言評(píng)論補(bǔ)充或指正。
開發(fā)環(huán)境
- MacOS: 14.3.1
- SSH: OpenSSH_9.4p1
單個(gè)SSH密鑰
如果不考慮匿名性,每臺(tái)設(shè)備只維護(hù)單個(gè)SSH
密鑰用于各個(gè)平臺(tái)是很輕松的,加上密碼安全性也有一定的保障。GitHub
使用SSH
進(jìn)行連接的步驟如下:
1.1. 生成SSH密鑰
- 執(zhí)行密鑰創(chuàng)建命令
# 這是使用RSA算法生成
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 現(xiàn)在一般推薦使用安全性更高的Ed25519算法生成
ssh-keygen -t ed25519 -C "your_email@example.com"
your_email@example.com
一般是GitHub
上賬號(hào)的電子郵件地址(來自GitHub
官方文檔的說法)。不過,這有個(gè)問題,一臺(tái)設(shè)備上如果只管理一個(gè)SSH
密鑰,然后不同平臺(tái)上的電子郵件地址又不一樣,那該填什么?
先不管GitHub
的說法,我們可以通過使用手冊(cè)命令看看-C
選項(xiàng)的含義:
man ssh-keygen
輸出很長(zhǎng),這里只展示關(guān)于-C
及-c
選項(xiàng)的內(nèi)容(補(bǔ)充:-t
選項(xiàng)是指定密鑰類型):
...
-C comment
Provides a new comment.
-c Requests changing the comment in the private and public key
files. The program will prompt for the file containing the
private keys, for the passphrase if the key has one, and for the
new comment.
...
可見-C
選項(xiàng)后面跟的只是注釋,方便你標(biāo)識(shí)這個(gè)密鑰(標(biāo)識(shí)用途或所有者等)。實(shí)測(cè),直接填your_email@example.com
也一切正常!而且這個(gè)注釋是可以通過-c
選項(xiàng)修改的,修改命令參考如下:
ssh-keygen -c -f ~/.ssh/id_ed25519
實(shí)測(cè)能修改成功,并且不需要更新已經(jīng)添加到GitHub
的公鑰,注釋信息并不會(huì)影響身份驗(yàn)證。所以,填什么請(qǐng)隨意。
- 設(shè)置密鑰存放路徑
# RSA算法生成
Enter file in which to save the key (/Users/xxx/.ssh/id_rsa):
# Ed25519算法生成
Enter file in which to save the key (/Users/xxx/.ssh/id_ed25519):
建議直接按Enter
鍵使用它已經(jīng)給出的默認(rèn)文件路徑,具體原因請(qǐng)看后面無密碼密鑰部分的內(nèi)容。
- 設(shè)置密鑰密碼
Enter passphrase (empty for no passphrase):
如果不使用密碼可以直接按Enter
鍵,不過建議使用密碼。生成密鑰成功后,可以參考以下命令新增/修改/刪除密碼:
ssh-keygen -p -f ~/.ssh/id_ed25519
- 生成密鑰成功
Your identification has been saved in /Users/xxx/.ssh/id_rsa(或id_ed25519)
Your public key has been saved in /Users/xxx/.ssh/id_rsa.pub(或id_ed25519.pub)
The key fingerprint is: xxx your_email@example.com
The key's randomart image is: xxx
參考文檔:
- GitHub - 生成新SSH密鑰
1.2. 添加SSH密鑰
打開SSH and GPG keys頁(yè)面,如果沒有登錄請(qǐng)先登錄。點(diǎn)擊[New SSH key]按鈕添加SSH
密鑰:
-
Title
:給密鑰設(shè)置描述性標(biāo)簽,可以用于區(qū)分設(shè)備。當(dāng)某個(gè)設(shè)備的私鑰泄漏時(shí),方便快速找到該設(shè)備的SSH
密鑰并刪除 -
Key type
:密鑰類型,分為Authentication Key
(身份驗(yàn)證)和Signing Key
(提交簽名),使用默認(rèn)的身份驗(yàn)證類型即可 -
Key
:前面生成的公鑰,可以通過以下命令將公鑰復(fù)制到剪貼板,也可以找到公鑰文件(.pub
擴(kuò)展名)用文本程序打開復(fù)制
# 復(fù)制RSA算法生成的密鑰
pbcopy < ~/.ssh/id_rsa.pub
# 復(fù)制Ed25519算法生成的密鑰
pbcopy < ~/.ssh/id_ed25519.pub
由于添加密鑰是敏感操作,GitHub
一般會(huì)讓你再次驗(yàn)證身份,參考Sudo 模式。
參考文檔:
- GitHub - 向你的帳戶添加新的SSH密鑰
1.3. 測(cè)試SSH連接
通過執(zhí)行以下命令測(cè)試:
ssh -T git@github.com
一般會(huì)得到這樣的輸出:
The authenticity of host 'github.com (20.205.243.166)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
其中SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU
是服務(wù)器的公鑰指紋,用于驗(yàn)證服務(wù)器的身份。GitHub的SSH密鑰指紋:
SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s
(RSA)SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM
(ECDSA)SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU
(Ed25519)
確認(rèn)公鑰匹配后,輸入yes
完成身份驗(yàn)證,會(huì)自動(dòng)在~/.ssh/known_hosts
文件中保存已驗(yàn)證服務(wù)器信息,后續(xù)無需再次驗(yàn)證,除非服務(wù)器信息有變化。
如果密鑰有密碼,需要輸入密碼完成連接測(cè)試。
參考文檔:
- GitHub - 向你的帳戶添加新的SSH密鑰
2.1. 簡(jiǎn)化密鑰密碼輸入
如果你的SSH
密鑰有設(shè)置密碼,那么你會(huì)發(fā)現(xiàn)每次使用(例如執(zhí)行git pull
命令)都需要輸入一遍密碼,相當(dāng)麻煩。那么有什么辦法可以解決這個(gè)問題呢?
這就不得不提到SSH
代理,將密鑰添加到代理,只需要輸一次密碼,后續(xù)無需重復(fù)輸入密碼。先在~/.ssh
路徑下創(chuàng)建config
文件(如果該文件不存在):
touch ~/.ssh/config
然后往里面添加配置:
Host github.com
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519
-
AddKeysToAgent
:將密鑰加入代理 -
UseKeychain
:將密碼存儲(chǔ)在鑰匙串 -
IdentityFile
:指定密鑰文件路徑
配置后,只需要輸入一次密碼,密碼會(huì)自動(dòng)保存到鑰匙串,打開鑰匙串應(yīng)用搜索SSH
關(guān)鍵詞可以找到存儲(chǔ)記錄。通過以下命令可以查看已經(jīng)添加到SSH
代理中的密鑰:
ssh-add -l
當(dāng)重啟電腦后(也可以通過killall ssh-agent
命令終止代理,在需要時(shí)會(huì)自動(dòng)重啟)馬上查看SSH
代理中的密鑰,你會(huì)發(fā)現(xiàn)沒有加載任何密鑰:
The agent has no identities.
這時(shí)使用SSH
連接(例如執(zhí)行git pull
命令),會(huì)自動(dòng)添加密鑰,也無需再輸入密碼。
關(guān)于配置中的Host
,這里引出另一個(gè)問題,現(xiàn)在只維護(hù)單個(gè)密鑰用于多個(gè)平臺(tái),按前面的配置,只有連接GitHub
時(shí)能簡(jiǎn)化密碼輸入,其他平臺(tái)還是每次都需要輸入密碼。
這很好解決,在config
文件中參考前面的配置修改Host
給其他平臺(tái)也增加配置即可。需要注意一點(diǎn),有些平臺(tái)的Host
可能類似這樣的git.github.com
,這時(shí)你要么完全按照這個(gè)配置,要么使用通配符*.github.com
。
如果平臺(tái)多了,配置也挺麻煩的,本來只維護(hù)單個(gè)密鑰就為了省事,那還有沒有更省事的方法呢?肯定是有的,參考如下配置:
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519
參考文檔:
- GitHub - 將SSH密鑰添加到ssh-agent
多個(gè)SSH密鑰
1.1. 生成/添加/測(cè)試SSH密鑰
參考前面單個(gè)SSH
密鑰的生成/添加/測(cè)試,除了設(shè)置密鑰存放路徑時(shí)需要重新命名區(qū)分已有的密鑰文件外,操作基本一樣。
我一般按照這個(gè)格式id_aaa.bbb
命名,aaa
是密鑰類型(例如ed25519
),bbb
是平臺(tái)標(biāo)識(shí)(例如github
)。按自己喜好命名,方便自己標(biāo)識(shí)就行。
2.1. 簡(jiǎn)化密鑰密碼輸入
參考前面單個(gè)SSH
密鑰的簡(jiǎn)化密碼輸入,可以針對(duì)不同平臺(tái)配置不同的密鑰文件:
Host github.com
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519.github
Host xxx.com
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_rsa.xxx
或者更簡(jiǎn)單點(diǎn)(不過都維護(hù)多個(gè)密鑰了,應(yīng)該很少這么做了吧):
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_rsa
如果按照上方示例中的配置,會(huì)根據(jù)先后順序匹配。例如id_ed25519
密鑰會(huì)被優(yōu)先匹配,只有當(dāng)匹配失敗或密碼錯(cuò)誤,才會(huì)繼續(xù)往下匹配。
無密碼密鑰
前面著重講設(shè)有密碼的密鑰,那如果密鑰不設(shè)置密碼還需要配置嗎?
這里先引出一個(gè)默認(rèn)密鑰文件的說法,默認(rèn)密鑰文件指使用默認(rèn)名稱命名并放在默認(rèn)路徑下的密鑰。默認(rèn)路徑和默認(rèn)名稱分別指:
-
默認(rèn)路徑:
~/.ssh
-
默認(rèn)名稱:
id_dsa
|id_ecdsa
|id_ecdsa_sk
|id_ed25519
|id_ed25519_sk
|id_rsa
進(jìn)而引出:
- 對(duì)于單個(gè)無密碼密鑰,只要屬于默認(rèn)密鑰文件,
SSH
會(huì)自動(dòng)添加,無需再額外配置 - 對(duì)于多個(gè)無密碼密鑰,不屬于默認(rèn)密鑰文件的需要在
config
文件中配置,參考配置如下:
Host github.com
IdentityFile ~/.ssh/id_ed25519.github
或許你會(huì)疑問,默認(rèn)密鑰文件的說法是怎么來的?
在已有密鑰的情況下創(chuàng)建新密鑰時(shí),我發(fā)現(xiàn)自定義命名的密鑰無法直接使用,同時(shí)將密鑰名稱改為默認(rèn)名稱后又可以了,所以合理猜測(cè)存在一些默認(rèn)密鑰文件會(huì)被SSH
自動(dòng)添加(無論密鑰是否有密碼,有密碼的密鑰不配置也能正常使用,只是需要輸入密碼)。
關(guān)于猜測(cè)的具體驗(yàn)證過程請(qǐng)看續(xù)篇:GitHub - 使用SSH進(jìn)行連接(續(xù))。
補(bǔ)充內(nèi)容
除了通過配置config
文件簡(jiǎn)化密碼輸入,還可以通過以下方法。
在~/.bash_profile
或~/.zshrc
文件末尾加上:
if ! ssh-add -l | grep -q "your_email@example.com"; then
ssh-add --apple-use-keychain ~/.ssh/id_ed25519.github
fi
其中your_email@example.com
是創(chuàng)建密鑰時(shí)的注釋(參考前面的密鑰創(chuàng)建),~/.ssh/id_ed25519.github
是密鑰文件路徑,請(qǐng)根據(jù)實(shí)際情況替換。
追加內(nèi)容保存后,重新打開終端或用source
命令使其生效。根據(jù)提示,首次輸入密碼后,后續(xù)無需再輸入密碼。
這個(gè)原理很簡(jiǎn)單,每當(dāng)打開終端時(shí),首先通過ssh-add -l
命令獲取已經(jīng)添加到SSH
代理中的密鑰信息,然后根據(jù)密鑰信息搜索是否包含特定注釋信息,以此判斷密鑰是否已經(jīng)被添加到SSH
代理中,最后如果沒添加則通過ssh-add --apple-use-keychain
命令添加。
--apple-use-keychain
的作用是將首次輸入的密碼存儲(chǔ)到鑰匙串中。補(bǔ)充一點(diǎn),以前是用-K
,現(xiàn)在已經(jīng)被棄用。
注意,這個(gè)方法有個(gè)缺點(diǎn),如果重啟電腦后你沒先打開終端觸發(fā)自動(dòng)加載密鑰,那就不會(huì)加載。
例如重啟電腦后,直接用Sourcetree
軟件執(zhí)行Git
相關(guān)操作,會(huì)報(bào)錯(cuò)。不過,Android Studio
是例外,猜測(cè)可能是因?yàn)樗鼏?dòng)時(shí)也啟動(dòng)了shell
進(jìn)程,觸發(fā)了密鑰加載。
簡(jiǎn)單驗(yàn)證一下猜測(cè):刪除鑰匙串中保存的密鑰密碼,并且通過killall ssh-agent
命令終止代理(清除已添加的密鑰),重新啟動(dòng)Android Studio
,隨意打開一個(gè)項(xiàng)目,結(jié)果卡住了一會(huì)兒,還彈了警告:
Learn more
按鈕指向Shell Environment Loading文章。
同時(shí)內(nèi)置終端卡在密鑰密碼輸入。結(jié)合Learn more
按鈕指向的文章可知,Android Studio
果然啟動(dòng)了shell
進(jìn)程,當(dāng)遇到首次加載密鑰需要輸入密碼時(shí),會(huì)因?yàn)榈却艽a輸入而卡住,直到等待超時(shí)。
最后
如果這篇文章對(duì)你有所幫助,點(diǎn)贊??收藏??支持一下吧,謝謝~文章來源:http://www.zghlxwxcb.cn/news/detail-855885.html
本篇文章由@crasowas發(fā)布于CSDN。文章來源地址http://www.zghlxwxcb.cn/news/detail-855885.html
到了這里,關(guān)于GitHub - 使用SSH進(jìn)行連接的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!