Git自由之章 - 關於SSH 公鑰

簡述

什麼是 Git 的 ssh key?這個問題其實我也很困惑,因此我才專門分享這篇關於 ssh key 的文章,着重分析瞭解什麼是 ssh key,它有什麼用,怎麼能用好它?本文主要由從網上收集資料加上本身的經驗彙總而成的經驗乾貨,能夠說的實戰經驗之談,但其中也有一些錯漏,歡迎指正。git

關於 ssh key

首先ssh是一種網絡協議,用於計算機之間的加密登陸。github

咱們使用ssh登陸服務器時,通常常見的會使用用戶名/密碼方式登陸,也可使用ssh key實行免密碼登陸,通常如今這種方式被Git服務器使用的比較多。shell

簡單來講,SSH提供了兩種級別的安全驗證:安全

第一種級別是基於密碼的安全驗證,知道帳號和密碼,就能夠登錄到遠程主機。服務器

Team的開發工做中,就是使用這種方式登錄編譯服務器,或者開發機器。由於是在內網中,這種級別的安全驗證已經足夠了。網絡

第二種級別是基於Public-key cryptography (公開密匙加密)機制的安全驗證。hexo

原理以下圖所示:app

圖片描述

其優勢在於無需共享的通用密鑰,解密的私鑰不發往任何用戶。ssh

即便公鑰在網上被截獲,若是沒有與其匹配的私鑰,也沒法解密,所截獲的公鑰是沒有任何用處的。ide

ssh key 的配置使用方案(一)

這是根據 Github 提供的 help 文檔教程:

首先進到 .ssh 目錄下:

$ cd ~/.ssh
# Checks to see if there is a directory named ".ssh" in your user directory

使用ssh-keygen產生新的key:

$ ssh-keygen -t rsa -C "your_email@example.com"
# Creates a new ssh key using the provided email. 
# Generating public/private rsa key pair.
# Enter file in which to save the key (/home/you/.ssh/id_rsa).

使用默認的文件名直接enter, 按提示輸入密碼(若是不提供密碼,SSH將無密碼鏈接,若是private key泄露可能會有安全問題):

Enter passphrase (empty for no passphrase): [Type a passphrase]
Enter same passphrase again: [Type passphrase again]

密匙產生成功:

Your identification has been saved in /home/you/.ssh/id_rsa.
Your public key has been saved in /home/you/.ssh/id_rsa.pub.
The key fingerprint is:
01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db your_email@example.com

上傳public key到Github帳戶

  • 登陸github

  • 點擊右上方的Accounting settings圖標

  • 選擇 SSH key

  • 點擊 Add SSH key

在出現的界面中填寫SSH key的名稱,填一個你本身喜歡的名稱便可,而後將上面拷貝的~/.ssh/id_rsa.pub文件內容粘帖到key一欄,在點擊「add key」按鈕就能夠了。

添加過程github會提示你輸入一次你的github密碼

設置SSH使用HTTPS的403端口

在局域網中SSH的22端口可能會被防火牆屏蔽,能夠設置SSH使用HTTPS的403端口。

測試HTTPS端口是否可用:

$ ssh -T -p 443 git@ssh.github.com
Hi username! You've successfully authenticated, but GitHub does not
provide shell access.

編輯SSH配置文件 ~/.ssh/config 以下:

Host github.com
  Hostname ssh.github.com
  Port 443

測試是否配置成功:

$ ssh -T git@github.com
Hi username! You've successfully authenticated, but GitHub does not
provide shell access.

ssh key 的配置使用方案(二)

這裏是利用ssh key實現免密碼登陸服務器

生成ssh key

ssh-keygen -t rsa -C "your name"

這樣默認會在本地的~/.ssh目錄下生成id_rsa,id_rsa.pub兩個文件:

  • id_rsa是私鑰。

  • id_rsa.pub是公鑰。

使用ssh key

  • ssh key方式登陸遠程服務器

咱們須要把id_rsa.pub拷貝到遠程服務器的~/.ssh下面。

並更名爲authorized_keys,這樣咱們就可使用key的方式登陸了。

$ ssh git@your.server.com
Enter passphrase for key '~/.ssh/id_rsa':

這樣咱們輸入shh key的密碼就能夠登陸了。

  • ssh key方式使用git clone代碼

若是咱們使用的是github/gitcafe, 只須要把id_rsa.pub的內容拷貝出來。

在github的setting裏面添加便可, 咱們就可使用ssh 方式clone代碼了。

//請修改成你本身的git地址
git clone git@github.com:chenyangcun/mydouban.git

clipboard.png

多站點使用不一樣的ssh key

默認ssh登陸時使用的是id_rsa文件,咱們也能夠指定其餘文件。

首先咱們生成不一樣的key:

ssh-keygen -t rsa -C "user1" -f user1
ssh-keygen -t rsa -C "user2" -f user2

咱們生成user1,user2兩個不一樣的ssh key,而後咱們在.ssh下建立config文件。

輸入:

Host company
  HostName company.com
  User git
  IdentityFile ~/.ssh/user1

Host github
  HostName github.com
  User git
  IdentityFile ~/.ssh/user2

這樣訪問company.com就會使用user1, 訪問github.com就會使用user2。

同一站點使用不一樣的ssh key

咱們有時候須要在同一站點使用不一樣的ssh key, 好比使用gitcafe的pages服務。

想要建立兩個站點,可是gitcafe上不容許不一樣的用戶使用同一個ssh key。

咱們在config文件裏作相應的修改

Host gitcafe-site1
  HostName gitcafe.com
  User git
  IdentityFile ~/.ssh/user1

Host gitcafe-site2
  HostName gitcafe.com
  User git
  IdentityFile ~/.ssh/user2

而後咱們更改git參考的遠程地址

#site1
$ git remote remove origin 
$ git remote add origin git@gitcafe-site1:user1/user1.git

#site2
$ git remote remove origin 
$ git remote add origin git@gitcafe-site2:user2/user2.git

關鍵是把gitcafe.com改成gitcafe-site1和gitcafe-site2

若是使用hexo, 在hexo的config文件中,把deploy的遠程地址改爲gitcafe-site1這樣的形式便可:

deploy:
type: git
repo: git@gitcafe-site1:user1/user1.git

ssh key 的配置使用方案(三)

這裏以配置github的ssh key爲例子。

1. 配置git用戶名和郵箱

git config user.name "用戶名"
git config user.email "郵箱"

在config後加上 --global 便可全局設置用戶名和郵箱。

2. 生成ssh key

ssh-keygen -t rsa -C "郵箱"

而後根據提示連續回車便可在~/.ssh目錄下獲得id_rsa和id_rsa.pub兩個文件,id_rsa.pub文件裏存放的就是咱們要使用的key。

3.上傳key到github

clip < ~/.ssh/id_rsa.pub
  • 複製key到剪貼板

  • 登陸github

  • 點擊右上方的Accounting settings圖標

  • 選擇 SSH key

  • 點擊 Add SSH key

4. 測試是否配置成功

ssh -T git@github.com

若是配置成功,則會顯示:

Hi username! You’ve successfully authenticated,
but GitHub does not provide shell access.

解決本地多個ssh key問題

有的時候,不只github使用ssh key,工做項目或者其餘雲平臺可能也須要使用ssh key來認證,若是每次都覆蓋了原來的id_rsa文件,那麼以前的認證就會失效。

這個問題咱們能夠經過在~/.ssh目錄下增長config文件來解決。

下面以配置搜狐雲平臺的ssh key爲例。

1. 第一步依然是配置git用戶名和郵箱

git config user.name "用戶名"
git config user.email "郵箱"

2. 生成ssh key時同時指定保存的文件名

ssh-keygen -t rsa -f ~/.ssh/id_rsa.sohu -C "email"

上面的id_rsa.sohu就是咱們指定的文件名,這時~/.ssh目錄下會多出id_rsa.sohu和id_rsa.sohu.pub兩個文件,id_rsa.sohu.pub裏保存的就是咱們要使用的key。

3. 新增並配置config文件

添加config文件

若是config文件不存在,先添加;存在則直接修改:

touch ~/.ssh/config

在config文件裏添加以下內容(User表示你的用戶名)

Host *.cloudscape.sohu.com
    IdentityFile ~/.ssh/id_rsa.sohu
    User test

4. 上傳key到雲平臺後臺(省略)

5. 測試ssh key是否配置成功

ssh -T git@git.cloudscape.sohu.com

成功的話會顯示:

Welcome to GitLab, username!

至此,本地便成功配置多個ssh key。

往後如需添加,則安裝上述配置生成key,並修改config文件便可。

gitlab 上配置使用 ssh key

這裏主要講述在 gitlab 上配置使用 ssh key

客戶端生成ssh-key

若是已經有sshkey,可用以前的。

在客戶端執行命令 ssh-keygen -t rsa -C "for xxx"

-C 選項後是備註,可隨意。

命令執行後會要求輸入key存儲的文件名和passphrase:

  • 輸入一個特有的文件名,不然使用默認的 id_rsa。

  • passphrase。不輸入也能夠。輸入以後,提交的時候要輸入這個passphrase

完成後在 ~/.ssh/ 會生成2個文件:

id_rsa 和 id_rsa.pub。(前者是私鑰,注意保管,後者是公鑰)

以下:

[huqiu@101 liaohuqiu]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/huqiu/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):

添加ssh-key到gitlab

登陸以後: Profile Settings => SSH-Keys => Add SSH key。

輸入以前生成的公鑰,標題隨意:

clipboard.png

基本使用介紹

配置好sshkey以後,你就能夠在命令行下使用git命令進行操做了。強烈建議使用命令行而不是使用圖形界面客戶端。

建立項目:

clipboard.png

建立完成:

clipboard.png

基本操做

  • clone(克隆)

  • add(跟蹤)

  • commit(提交)

  • push(推送)

clone(克隆)

[huqiu@101 git]$ git clone git@git.liaohuqiu.net:huqiu/test.git
Cloning into 'test'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done

進入目錄

[huqiu@101 git]$ cd test/
[huqiu@101 test]$ ll
total 0

建立一個文件

[huqiu@101 test]$ echo "### hello, test" > README.md

爲項目配置用戶名和郵箱,用戶名和郵箱會進入到日誌

[huqiu@101 test]$ git config user.name liaohuqiu
[huqiu@101 test]$ git config user.email liaohuqiu@gmail.com

add(跟蹤),添加文件到本地庫

[huqiu@101 test]$ git add README.md

*commit(提交)*
[huqiu@101 test]$ git commit -a -m 'add README'
[master (root-commit) 1095bd8] add README
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

push(推送)

[huqiu@101 test]$ git push origin master
    Counting objects: 3, done.
    Writing objects: 100% (3/3), 230 bytes | 0 bytes/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    To git@git.liaohuqiu.net:huqiu/test.git
     * [new branch]      master -> master

提交完成後記錄:

clipboard.png

項目的文件狀況:

clipboard.png

關於 github與gitlab 多個 ssh key 的處理方案

這裏主要是處理 github 的 ssh key 與 gitlab 的 ssh key 的衝突和相互覆蓋問題

若是你之前用 github 的 ssh key ,後來又多了一個 gitlab 的帳號,那麼在綁定 gitlab 的 ssh key 的時候,你會發現 原來的 github 的 ssh key 被覆蓋了,這就是問題所在,怎麼能實現二者同時綁定呢:

在.ssh目錄下新建一個config文件配置一下,就能解決gitlab與github的ssh key的衝突。

生成並添加第一個ssh key

cd ~/.ssh
ssh  ssh-keygen -t ras -C "youremail@yourcompany.com"

這時能夠一路回車,不輸入任何字符,將自動生成id_rsa和id_rsa.pub文件。

生成並添加第二個ssh key

$ ssh-keygen -t rsa -C "youremail@gmail.com"

注意,這時不能一路回車,不然郵箱將覆蓋上一次生成的ssh key,給這個文件起一個名字, 好比叫 id_rsa_github, 因此相應的也會生成一個 id_rsa_github.pub 文件。

clipboard.png

此時查看.ssh下的目錄文件,發現多了id_rsa_github和id_rsa_github.pub兩個文件。

clipboard.png

添加私鑰

$ ssh-add ~/.ssh/id_rsa
$ ssh-add ~/.ssh/id_rsa_github

修改配置文件

在 ~/.ssh 目錄下新建一個config文件

touch config

並添加如下內容

# gitlab
Host gitlab.com
    HostName gitlab.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa

# github
Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_github

給github/gitlab上添加ssh key

查看ssh key執行cat id_rsa_github.pub內容,將文本內容拷貝到https://github.com/settings/ssh

生成ssh key的方法能夠去看官方教程,這裏再也不贅述。

測試

$ ssh -T git@github.com

若是輸出:

Hi xuyuan923! You've successfully authenticated, 
but GitHub does not provide shell access.

說明成功的連上github了。

相關文章
相關標籤/搜索