常見的代碼托管平臺GitHub、GitLab和BitBucket等,基本都會使用Git作為版本控制工具。平臺一般都提供兩種認(rèn)證方式https和ssh。了解該過程能夠更加自由的配置和使用,本文就來簡單聊一下這兩種認(rèn)證方式。
Git可以使用四種協(xié)議來傳輸數(shù)據(jù):本地協(xié)議(Local),git 協(xié)議,HTTPs 協(xié)議和SSH(Secure Shell)協(xié)議。對于多人遠(yuǎn)程協(xié)作,多用后兩者。
超文本傳輸協(xié)議http運行于網(wǎng)絡(luò)應(yīng)用層,是應(yīng)用層通信協(xié)議,使用下層的TCP協(xié)議進(jìn)行傳輸控制。
位于不同網(wǎng)絡(luò)終端的兩個應(yīng)用進(jìn)程之間可以通過http進(jìn)行通信,典型的應(yīng)用場景是瀏覽器和網(wǎng)站服務(wù)器,是一種C/S Model.
Https可以看做是http+ssl,ssl協(xié)議位于網(wǎng)絡(luò)應(yīng)用層和傳輸層之間,主要為應(yīng)用層提供加密服務(wù),https即為http協(xié)議使用ssl協(xié)議加密傳輸數(shù)據(jù)。
SSH為Secure Shell 的縮寫,即安全外殼協(xié)議。SSH 為建立在應(yīng)用層基礎(chǔ)上的安全協(xié)議。SSH 是目前較可靠,專為遠(yuǎn)程登錄會話和其他網(wǎng)絡(luò)服務(wù)提供安全性的協(xié)議。
常說的ssh client如OpenSSH等只是SSH協(xié)議的一種程序?qū)崿F(xiàn),也就是ssh client程序支持SSH協(xié)議相關(guān)標(biāo)準(zhǔn)。
對于code repo的管理,顯然是需要加密進(jìn)行身份認(rèn)證的。
https方式clone一個repo或者pull和push到遠(yuǎn)端只需要根據(jù)提示提供自己的username和password即可。
這種方式比價的簡便和便于理解,使用自己在平臺的賬號和密碼進(jìn)行授權(quán)并進(jìn)行repo相關(guān)操作。
賬號密碼以及后續(xù)repo相關(guān)的傳輸均使用ssl加密。ssl加密解密的過程完全透明。
ssl認(rèn)證需要首先驗證服務(wù)器有有效的證書,對服務(wù)器的認(rèn)證是通過非對稱秘鑰的方式,該非對稱秘鑰由第三方公證機構(gòu)CA提供。
然后通過該非對稱密鑰對和服務(wù)器私密的協(xié)商后續(xù)數(shù)據(jù)傳輸使用的加密算法以及用于生成對稱秘鑰的一些隨機數(shù)據(jù)。
ssl握手協(xié)議結(jié)束后會產(chǎn)生只有client和server知道的對稱加密秘鑰,而該秘鑰也用后續(xù)所有傳輸數(shù)據(jù)的加密。詳細(xì)過程可以參考相關(guān)資料。
即兩步:
實際操作只需要用到第一步,window和一些第三方git client可以支持永久保存自己的賬號和密碼。
Windows查看保存的賬號信息:
Win鍵 ->搜索credential ->管理Windows 憑據(jù) -> 普通憑據(jù)(or 控制面板 -> 用戶賬戶 -> 管理Windows 憑據(jù) -> 普通憑據(jù))
https實際操作有一步,但是操作權(quán)限驗證和傳輸加密是分開的。
ssh不僅可以壓縮和加密傳輸數(shù)據(jù)還可以進(jìn)行身份授權(quán)驗證。
ssh方式使用非對稱加密所需的key-pairs完成身份驗證和傳輸數(shù)據(jù)加密,git client和server分別需要持有非對稱秘鑰對中的一個。
出于安全和保密考慮,通常由用戶使用秘鑰生成工具生成RSA密鑰對,并將其中的public key添加到服務(wù)端,自己保留private key。
ssh client使用private key向服務(wù)端證明自己的身份。
ssh 看起來似乎更加的安全方便,因為它將身份驗證和賬戶密碼分離開來,可以單獨使用秘鑰來進(jìn)行代碼庫的操作。
但是使用ssh的初始步驟可能有點麻煩,這個后面介紹。
此外,private key由文件保存,存在丟失的風(fēng)險,對private key進(jìn)行密碼保護,需要每次使用的時候都輸入密碼。
不管是git bash還是其他的git client都可以直接使用https,但是使用ssh需要單獨的ssh client。
The only requirement is to have the OpenSSH client installed on your system. This comes pre-installed on GNU/Linux and macOS, but not on Windows
并自己生成和管理秘鑰對,而且對于非默認(rèn)路徑下rsa密鑰對,需要額外相對復(fù)雜的處理。
https方式使用賬號和密碼授權(quán),簡單易用,便于進(jìn)行權(quán)限細(xì)分管理,而且防火墻一般會打開 http 和https協(xié)議的端口號80 和 443??梢赃M(jìn)行匿名訪問,對于開源項目,其他人即使沒有任何權(quán)限也可以方便進(jìn)行除提交之外的克隆和讀取操作。但是可能需要每個項目成員都有一個代碼托管平臺的賬號,而且缺乏憑證管理的話,可能要頻繁的進(jìn)行賬號密碼輸入。
ssh方式單獨使用非對稱的秘鑰進(jìn)行認(rèn)證和加密傳輸,和賬號密碼分離開來,不需要賬號也可以訪問repo。生成和管理秘鑰有點繁瑣,需要管理員添加成員的public key。不能進(jìn)行匿名訪問,ssh不利于對權(quán)限進(jìn)行細(xì)分,用戶必須具有通過SSH協(xié)議訪問你主機的權(quán)限,才能進(jìn)行下一步操作,比較適合內(nèi)部項目。
總的來說,https方便快捷,ssh的使用更加靈活。
如果git使用ssh協(xié)議,初始化設(shè)置需要三步:
操作無誤后,然后便可以使用ssh方式操作repo。
對于在默認(rèn)路徑~/.ssh/id_rsa下生成的id_rsa密鑰對,任何ssh client是可以直接讀取到。可以忽略上面的最后一步以及下面將要介紹的內(nèi)容。
對于第二步,可以參照一下具體網(wǎng)站的操作,對于github和gitlab,可以在settings中ssh key相關(guān)的界面添加保存公鑰。
下面主要介紹一下第一步和最后一步自定義秘鑰對生成路徑的情況。
生成ssh key pairs的工具有很多:
等等。git bash生成方式較為靈活,下面以這個為例來介紹。
Git Bash下直接使用ssh-keygen命令需要指定秘鑰生成路徑和保護密碼。下面是一種新的更為安全的ssh秘鑰生成方式:
ssh-keygen -o -t rsa -b 4096 -C "your_email@163.com" -f ~/.ssh/new_dir/id_rsa
生成過程中設(shè)置的passphrase主要是為了防止別人盜用你的秘鑰文件,如果設(shè)置有保護密碼,首次添加id_rsa會要求輸入保護密碼用以證明秘鑰是你的。
查看rsa秘鑰fingerprints信息(standard SHA256 Key output):
ssh-keygen -lf ~/.ssh/new_dir/id_rsa.pub(output) 4096 SHA256:myo......xac your_email@163.com (RSA)
Old MD5 Format:
$ ssh-keygen -E md5 -lf ~/.ssh/new_dir/id_rsa.pub(output) 4096 MD5:ba:......fb:8e your_email@163.com (RSA)
官網(wǎng)上下載的git安裝完成后會有g(shù)it bash和git gui可以使用,分別對應(yīng)于git client命令行和可視化圖形界面。
git bash環(huán)境可以支持部分linux命令,其中ssh client默認(rèn)使用的是OpenSSH.
$ ssh -VOpenSSH_7.7p1, OpenSSL 1.0.2o 27 Mar 2018
ssh client運行時會默認(rèn)使用~/.ssh/id_rsa,假設(shè)該秘鑰存在的情況下。對于非默認(rèn)路徑下的秘鑰,需要為ssh client指定。
OpenSSH
OpenSSH的參數(shù)來源主要是通過ssh_config(OpenSSH SSH client configuration files)
對于Openssh配置方式以及優(yōu)先級低到高依次為:
ssh_config文件的基本結(jié)構(gòu)是:keyword arguments(參數(shù)名 參數(shù)值),#為行注釋符,具體細(xì)節(jié)可以參考 man 5 ssh_config。
實際可以使用其中的任何一個設(shè)定ssh client,下面分別介紹這三種方式,這里我們只關(guān)注非默認(rèn)路徑下秘鑰文件的指定操作。
a). ssh_config
在Windows中安裝完git for windows之后,Git安裝目錄/etc/ssh/ssh_config找到ssh_config,該文件的大部分配置默認(rèn)均被注釋掉了。
通過添加下面的內(nèi)容進(jìn)行自定義秘鑰的指定:
Host github.com
Preferredauthentications publickey IdentityFile ~/.ssh/github/id_rsaHost gitlab.com
Preferredauthentications publickey
IdentityFile ~/.ssh/gitlab/id_rsa
b). config
~/.ssh/目錄下是沒有config文件的,需要自己添加,內(nèi)容和上面的ssh_config一樣。
c). command line
eval $(ssh-agent -s)ssh-add ~/.ssh/other_id_rsa
直接運行ssh-add會添加默認(rèn)的~/.ssh/id_rsa,可以使用指令ssh-add -l查看命令行添加的id_rsa.
命令行相對于另外兩種配置方式,每次打開git bash都需要進(jìn)行重新添加,比較麻煩。
用上面任何一種方式添加指定的秘鑰,測試添加成功與否可以使用下面的命令:
$ ssh -T git@github.comor$ ssh -T git@gitlab.com
認(rèn)證成功和失敗分別返回:
Welcome to GitLab, @your username!git@gitlab.com: Permission denied (publickey).
相比較與命令行,使用ssh config的方式更加方便,而且配置文件也可以被git gui使用。
注意:
SourceTree是一個較為流行g(shù)it client。會自動保存https方式認(rèn)證的賬戶名和密碼,可在tools -> options -> authentication中管理。
在sourcetree中使用ssh方式只需要指定使用的ssh client,然后添加對應(yīng)的ssh密鑰即可。
方式一:tools -> options -> general -> ssh client configuration;
方式二:tools -> add ssh key;
第一種方法可以批量添加ssh key,之間使用分號;分開。
ssh client configuration中可以看到已經(jīng)添加的所有的ssh key,同時這里可以指定特定的ssh client(PuTTY/Plink or OpenSSH )。
由于ssh-agent會在sourcetree啟動的時候開啟并添加指定的ssh key,因此方式一添加的ssh key,可能要重啟sourcetree才能生效。
配置完成后,使用ssh方式clone一個庫的時候,sourcetree能夠自動識別repository type說明配置是正確的。
1. Git全局設(shè)置
首次使用git需要配置一下自己的用戶名和郵箱,作為每次提交者的身份,會被記錄在提交日志中。
git config --global user.name "your username"git config --global user.email "your email"
這里設(shè)置的全局信息存放在~/.gitconfig中,可以使用git config -l 查看所有全局設(shè)置的信息。
2. https方式緩存賬號和密碼
除了操作系統(tǒng)和第三方工具提供的憑證保存方案,可以參考一下github介紹的一種方式:Caching your GitHub password in Git。
還可以通過為git指定憑據(jù)管理器的方式緩存憑證:
新建文件~/.git-credentials,內(nèi)容為:https://{username}:{passwd}@github.com
為~/.gitconfig添加憑據(jù)地址:
可以通過執(zhí)行命令$ git config --global credential.helper store來完成。建議使用系統(tǒng)憑據(jù)管理器,不推薦這種方式。
3.knows_hosts文件
文件~/.ssh/known_hosts中存放的是所有已經(jīng)安全連接過的服務(wù)器(hosts)的公鑰。
Warning: Permanently added 'gitlab.com,35.231.145.151' (ECDSA) to the list of known hosts.
參考:
https://docs.gitlab.com/ee/ssh/