Git之深入解析凭证存储
生活随笔
收集整理的這篇文章主要介紹了
Git之深入解析凭证存储
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 了解了管理或者維護 Git 倉庫、實現代碼控制所需的大多數日常命令和工作流程,嘗試跟了蹤和提交文件的基本操作,并且掌握了暫存區和輕量級地分支及合并的威力。如果想進一步對 Git 深入學習,可以學習一些 Git 更加強大的功能,這些功能可能并不會在日常操作中使用,但在某些時候可能還是會起到一定的關鍵性作用。
- 如果還不清楚 Git 的基礎使用流程、分支的管理、托管服務器的技術以及分布式工作流程等相關的技術和能力,請參考博客:
-
- Git之深入解析Git的安裝流程與初次運行Git前的環境配置;
-
- Git之深入解析本地倉庫的基本操作·倉庫的獲取更新和提交歷史的查看撤銷以及標簽別名的使用;
-
- Git之深入解析Git的殺手級特性·分支管理與變基的開發工作流以及遠程分支的跟蹤;
-
- Git之深入解析如何運行自己的Git倉庫托管服務器;
-
- Git之深入解析如何使用Git的分布式工作流程與如何管理多人開發貢獻的項目。
- 如果使用的是 SSH 方式連接遠端,并且設置了一個沒有口令的密鑰,這樣就可以在不輸入用戶名和密碼的情況下安全地傳輸數據。然而,這對 HTTP 協議來說是不可能的,每一個連接都是需要用戶名和密碼的,這在使用雙重認證的情況下會更麻煩,因為需要輸入一個隨機生成并且毫無規律的 token 作為密碼。
- 幸運的是,Git 擁有一個憑證系統來處理這個事情,如下所示:
-
- 默認所有都不緩存,每一次連接都會詢問你的用戶名和密碼;
-
- “cache” 模式會將憑證存放在內存中一段時間,密碼永遠不會被存儲在磁盤中,并且在15分鐘后從內存中清除;
-
- “store” 模式會將憑證用明文的形式存放在磁盤中,并且永不過期,這意味著除非修改了在 Git 服務器上的密碼,否則永遠不需要再次輸入憑證信息,這種方式的缺點是密碼是用明文的方式存放在 home 目錄下;
-
- 如果使用的是 Mac,Git 還有一種 “osxkeychain” 模式,它會將憑證緩存到系統用戶的鑰匙串中,這種方式將憑證存放在磁盤中,并且永不過期,但是是被加密的,這種加密方式與存放 HTTPS 憑證以及 Safari 的自動填寫是相同的;
-
- 如果使用的是 Windows,可以安裝一個叫做 “Git Credential Manager for Windows” 的輔助工具,這和上面說的 “osxkeychain” 十分類似,但是是使用 Windows Credential Store 來控制敏感信息,可以在 Git-Credential-Manager-for-Windows下載。
- 可以設置 Git 的配置來選擇上述的一種方式:
- 部分輔助工具有一些選項,“store” 模式可以接受一個 --file 參數,可以自定義存放密碼的文件路徑(默認是 ~/.git-credentials )。 “cache” 模式有 --timeout 參數,可以設置后臺進程的存活時間(默認是 “900”,也就是 15 分鐘)。 如下所示,是一個配置 “store” 模式自定義路徑的例子:
- Git 甚至允許配置多個輔助工具,當查找特定服務器的憑證時,Git 會按順序查詢,并且在找到第一個回答時停止查詢。當保存憑證時,Git 會將用戶名和密碼發送給所有配置列表中的輔助工具,它們會按自己的方式處理用戶名和密碼。如果在閃存上有一個憑證文件,但又希望在該閃存被拔出的情況下使用內存緩存來保存用戶名密碼,.gitconfig 配置文件如下:
底層實現
- 這些是如何實現的呢? Git 憑證輔助工具系統的命令是 git credential,這個命令接收一個參數,并通過標準輸入獲取更多的參數。
- 假設已經配置好一個憑證輔助工具,這個輔助工具保存了 mygithost 的憑證信息,如下,是一個使用 “fill” 命令的會話,當 Git 嘗試尋找一個服務器的憑證時就會被調用:
- 分析說明:
-
- (1) 這是開始交互的命令;
-
- (2) Git-credential 接下來會等待標準輸入,我們提供所知道的信息:協議和主機名;
-
- (3) 一個空行代表輸入已經完成,憑證系統應該輸出它所知道的信息;
-
- (4) 接下來由 Git-credential 接管,并且將找到的信息打印到標準輸出;
-
- (5) 如果沒有找到對應的憑證,Git 會詢問用戶的用戶名和密碼,將這些信息輸入到在標準輸出的地方(這個例子中是同一個控制臺)。
- 憑證系統實際調用的程序和 Git 本身是分開的;具體是哪一個以及如何調用與 credential.helper 配置的值有關。 這個配置有多種格式:
| foo | 執行 git-credential-foo |
| foo -a --opt=bcd | 執行 git-credential-foo -a --opt=bcd |
| /absolute/path/foo -xyz | 執行 /absolute/path/foo -xyz |
| !f() { echo “password=s3cre7”; }; f | ! 后面的代碼會在 shell 執行 |
- 上面描述的輔助工具可以被稱做 git-credential-cache、git-credential-store 之類,我們可以配置它們來接受命令行參數,通常的格式是 “git-credential-foo [args] ” 標準輸入/輸出協議和 git-credential 一樣,但它們使用的是一套稍微不太一樣的行為:
-
- get 是請求輸入一對用戶名和密碼;
-
- store 是請求保存一個憑證到輔助工具的內存;
-
- erase 會將給定的證書從輔助工具內存中清除。
- 對于 store 和 erase 兩個行為是不需要返回數據的(Git 也會忽略掉)。然而對于 get,Git 對輔助工具的返回信息十分感興趣,如果輔助工具并不知道任何有用的信息,它就會直接退出而沒有任何輸出,但如果知道的話,它就會在已存儲信息的基礎上擴充所提供的信息,它的輸出可看做一系列賦值語句,提供的任何內容都會取代 Git 已知的內容。
- 如果輔助工具沒有任何有用的信息,它可以直接退出而不需要輸出任何東西,但如果它有這些信息,它在提供的信息后面增加它所擁有的信息,這些輸出會被視為一系列的賦值語句;每一個提供的數據都會將 Git 已有的數據替換掉。
- 這有一個和上面一樣的例子,但是跳過了 git-credential 這一步,直接到 git-credential-store:
- 分析說明:
-
- (1) 告訴 git-credential-store 去保存憑證:當訪問 https://mygithost 時使用用戶名 “bob”,密碼是 “s3cre7”;
-
- (2) 現在取出這個憑證,我們提供連接這部分的信息(https://mygithost)以及一個空行;
-
- (3) git-credential-store 輸出我們之前保存的用戶名和密碼。
- ~/git.store 文件的內容類似:
- 僅僅是一系列包含憑證信息 URL 組成的行。 osxkeychain 和 wincred 輔助工具使用它們后端存儲的原生格式,而 cache 使用它的內存格式(其他進程無法讀取)。
自定義憑證緩存
- 已經知道 git-credential-store 之類的是和 Git 是相互獨立的程序,就不難理解 Git 憑證輔助工具可以是任意程序,雖然 Git 提供的輔助工具覆蓋了大多數常見的使用場景,但并不能滿足所有情況。比如,假設整個團隊共享一些憑證,也許是在部署時使用,這些憑證是保存在一個共享目錄里,由于這些憑證經常變更,所以不想把它們復制到我們自己的憑證倉庫中。現有的輔助工具無法滿足這種情況;來看看我們如何自己實現一個,這個程序應該擁有幾個核心功能:
-
- 唯一需要關注的行為是 get;store 和 erase 是寫操作,所以當接受到這兩個請求時我們直接退出即可;
-
- 共享的憑證文件格式和 git-credential-store 使用的格式相同;
-
- 憑證文件的路徑一般是固定的,但我們應該允許用戶傳入一個自定義路徑以防萬一。
- 我們再一次使用 Ruby 來編寫這個擴展,但只要 Git 能夠執行最終的程序,任何語言都是可以的。這是我們的憑證輔助工具的完整代碼:
- 分析說明:
-
- (1) 在這里解析命令行參數,允許用戶指定輸入文件,默認是 ~/.git-credentials;
-
- (2) 這個程序只有在接受到 get 行為的請求并且后端存儲的文件存在時才會有輸出;
-
- (3) 這個循環從標準輸入讀取數據,直到讀取到第一個空行,輸入的數據被保存到 known 哈希表中,之后需要用到;
-
- (4)這個循環讀取存儲文件中的內容,尋找匹配的行,如果 known 中的協議和主機名與該行相匹配,這個程序輸出結果并退出。
- 我們把這個輔助工具保存為 git-credential-read-only,放到我們的 PATH 路徑下并且給予執行權限。一個交互式會話類似:
- 由于這個的名字是 “git-” 開頭,所以可以在配置值中使用簡便的語法:
- 正如看到的,擴展這個系統是相當簡單的,并且可以為團隊解決一些常見問題。
總結
以上是生活随笔為你收集整理的Git之深入解析凭证存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Git之深入解析在没有合适的网络或者可共
- 下一篇: GitHub之深入解析如何对项目做出贡献