7.14 憑證存儲

2018-02-24 15:22 更新

憑證存儲

如果你使用的是 SSH 方式連接遠(yuǎn)端,并且設(shè)置了一個沒有口令的密鑰,這樣就可以在不輸入用戶名和密碼的情況下安全地傳輸數(shù)據(jù)。 然而,這對 HTTP 協(xié)議來說是不可能的 —— 每一個連接都是需要用戶名和密碼的。 這在使用雙重認(rèn)證的情況下會更麻煩,因?yàn)槟阈枰斎胍粋€隨機(jī)生成并且毫無規(guī)律的 token 作為密碼。

幸運(yùn)的是,Git 擁有一個憑證系統(tǒng)來處理這個事情。 下面有一些 Git 的選項(xiàng):

  • 默認(rèn)所有都不緩存。 每一次連接都會詢問你的用戶名和密碼。

  • “cache” 模式會將憑證存放在內(nèi)存中一段時間。 密碼永遠(yuǎn)不會被存儲在磁盤中,并且在15分鐘后從內(nèi)存中清除。

  • “store” 模式會將憑證用明文的形式存放在磁盤中,并且永不過期。 這意味著除非你修改了你在 Git 服務(wù)器上的密碼,否則你永遠(yuǎn)不需要再次輸入你的憑證信息。 這種方式的缺點(diǎn)是你的密碼是用明文的方式存放在你的 home 目錄下。

  • 如果你使用的是 Mac,Git 還有一種 “osxkeychain” 模式,它會將憑證緩存到你系統(tǒng)用戶的鑰匙串中。 這種方式將憑證存放在磁盤中,并且永不過期,但是是被加密的,這種加密方式與存放 HTTPS 憑證以及 Safari 的自動填寫是相同的。

  • 如果你使用的是 Windows,你可以安裝一個叫做 “winstore” 的輔助工具。 這和上面說的 “osxkeychain” 十分類似,但是是使用 Windows Credential Store 來控制敏感信息。 可以在??下載。

你可以設(shè)置 Git 的配置來選擇上述的一種方式

$ git config --global credential.helper cache

部分輔助工具有一些選項(xiàng)。 “store” 模式可以接受一個?--file <path>?參數(shù),可以自定義存放密碼的文件路徑(默認(rèn)是~/.git-credentials)。 “cache” 模式有?--timeout <seconds>?參數(shù),可以設(shè)置后臺進(jìn)程的存活時間(默認(rèn)是 “900”,也就是 15 分鐘)。 下面是一個配置 “store” 模式自定義路徑的例子:

$ git config --global credential.helper store --file ~/.my-credentials

Git 甚至允許你配置多個輔助工具。 當(dāng)查找特定服務(wù)器的憑證時,Git 會按順序查詢,并且在找到第一個回答時停止查詢。 當(dāng)保存憑證時,Git 會將用戶名和密碼發(fā)送給?所有?配置列表中的輔助工具,它們會按自己的方式處理用戶名和密碼。 如果你在閃存上有一個憑證文件,但又希望在該閃存被拔出的情況下使用內(nèi)存緩存來保存用戶名密碼,.gitconfig?配置文件如下:

[credential]
    helper = store --file /mnt/thumbdrive/.git-credentials
    helper = cache --timeout 30000

底層實(shí)現(xiàn)

這些是如何實(shí)現(xiàn)的呢? Git 憑證輔助工具系統(tǒng)的命令是?git credential,這個命令接收一個參數(shù),并通過標(biāo)準(zhǔn)輸入獲取更多的參數(shù)。

舉一個例子更容易理解。 我們假設(shè)已經(jīng)配置好一個憑證輔助工具,這個輔助工具保存了?mygithost的憑證信息。 下面是一個使用 “fill” 命令的會話,當(dāng) Git 嘗試尋找一個服務(wù)器的憑證時就會被調(diào)用。

$ git credential fill 
protocol=https 
host=mygithost

protocol=https 
host=mygithost
username=bob
password=s3cre7
$ git credential fill 
protocol=https
host=unknownhost

Username for 'https://unknownhost': bob
Password for 'https://bob@unknownhost':
protocol=https
host=unknownhost
username=bob
password=s3cre7

這是開始交互的命令。

Git-credential 接下來會等待標(biāo)準(zhǔn)輸入。 我們提供我們所知道的信息:協(xié)議和主機(jī)名。

一個空行代表輸入已經(jīng)完成,憑證系統(tǒng)應(yīng)該輸出它所知道的信息。

接下來由 Git-credential 接管,并且將找到的信息打印到標(biāo)準(zhǔn)輸出。

這個程序只有在接受到?get?行為的請求并且后端存儲的文件存在時才會有輸出。

這個循環(huán)從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù),直到讀取到第一個空行。 輸入的數(shù)據(jù)被保存到?known?哈希表中,之后需要用到。

這個循環(huán)讀取存儲文件中的內(nèi)容,尋找匹配的行。 如果?known?中的協(xié)議和主機(jī)名與該行相匹配,這個程序輸出結(jié)果并退出。

我們把這個輔助工具保存為?git-credential-read-only,放到我們的?PATH?路徑下并且給予執(zhí)行權(quán)限。 一個交互式會話類似:

$ git credential-read-only --file=/mnt/shared/creds get
protocol=https
host=mygithost

protocol=https
host=mygithost
username=bob
password=s3cre7

由于這個的名字是 “git-” 開頭,所以我們可以在配置值中使用簡便的語法:

$ git config --global credential.helper read-only --file /mnt/shared/creds

正如你看到的,擴(kuò)展這個系統(tǒng)是相當(dāng)簡單的,并且可以為你和你的團(tuán)隊(duì)解決一些常見問題。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號