生成密鑰對

眾所週知, 非對稱性加密中存在公鑰(public key)與私鑰(private key)

一般如果要用於ssh 登入或是GitHub ssh 密鑰, 你需要在本地生成密鑰對, 添加公鑰到遠端服務器或是GitHub, 並透過私鑰來建立安全通信

密鑰對的生成很簡單, 使用下面命令即可

1
ssh-keygen -t rsa -C "這裡可以寫註釋"
  • -t rsa 指的是生成rsa 密鑰對
  • -C "註釋" 添加注釋, 可以不寫, 也可以寫你的 email

接著會問你要把生成出來的密鑰對放在哪, 預設會存在 ~/.ssh目錄下, 預設檔案名為id_rsa, 如果不想改可以直接點enter

1
2
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa):

接下來會問你要 passphrase, 這相當於你的私鑰的密碼, 不寫就沒有密碼

Passphrase是一个用于加密和保护你的私钥的密码。在生成SSH密钥对时,系统会要求你输入一个passphrase以保护你的私钥不被未经授权的访问者获取到。

如果你将生成的私钥用于访问远程服务器或代码托管服务,那么passphrase就是保护你SSH私钥的第一道防线,以防止其他人使用你的密钥进行未授权的操作。

当你使用生成的SSH密钥进行SSH会话时,系统会要求你输入passphrase。如果你正确地输入了passphrase,那么你就可以继续与远程服务器进行通信,否则你将无法通过验证,无法进行后续操作。

因此,尽管输入passphrase可能会给你带来一些不便,但这是保护你SSH密钥和与远程服务器的通信的一种非常重要的安全措施。
– chatGPT 3.5

然後你的密鑰對就生成好了, 應該會放在你前面指定的位置, 如果沒有指定就會是 ~/.ssh/ 目錄下的 id_rsaid_rsa.pub

沒副檔名那個是私鑰, 副檔名為.pub 那個文件就是公鑰

公鑰和私鑰文件都是純文字文件, 如果平台(如GitHub)要求你貼上公鑰文本, 直接把公鑰的內容貼進去就行了

向服務器導入public key

用於GitHub密鑰的導入很簡單, 用網頁介面就行了

如果你生成密鑰對的目的是用於 ssh, 這裡還有一些有價值的內容

生成完密鑰對後, 我們需要向服務器傳送公鑰

如果你使用的服務器提供商可以讓你上傳公鑰, 那你直接上傳就行了

接下來介紹使用命令向遠端服務器傳送並導入ssh 公鑰的方法

ssh-copy-id

使用 ssh-copy-id命令來向服務器傳送公鑰

1
ssh-copy-id -i <publickey.pub> [email protected]
  • -i <publickey.pub> 指定公鑰文件
  • [email protected] 就是你一般連接ssh 時的 用戶名@主機

要注意, 在存放公鑰的目錄下必須要有一個 同名的私鑰文件, 因為 ssh-copy-id 命令 預設會去尋找你的 私鑰, 以確保你持有對應私鑰, 找不到的話會可能會報錯

報錯信息可能會長得像這樣

1
/usr/local/bin/ssh-copy-id: ERROR: failed to open ID file './id_rsa': No such file or directory

可以使用 -f 規避, 令ssh-copy-id不去尋找對應的私鑰

所以就會是

1
ssh-copy-id -i <publickey.pub> -f user@host

導出的 public key 會被存在服務器的 ~/.ssh/authorized_keys 檔案中

此處參考了 StackExchange 的
這篇文章

使用私鑰ssh遠程服務器

現在, 服務器上有公鑰, 你的手上有對應的私鑰, 可以嘗試連結了

不導入 private key 直接連線

你可以在 ssh 的時後直接提供私鑰文件 並連接

1
ssh -i <path to key> [email protected]

當然, 如果你不想每次 ssh 的時候都要提供私鑰文件的位置, 你可以導入私鑰

導入私鑰

將私鑰文件 放在某個合適的地方, 然後在 ~/.ssh/config文件中添加以下條目:

1
2
3
4
Host 93.184.216.34 example.com
HostName 93.184.216.34
User ubuntu
IdentityFile ~/.ssh/keys/ssh-key
  • 如果希望使用域名及ip訪問, 或是有多個指向同一服務器的域名, 就在Host欄目後面(上例第一行)多添加幾條, 用空格隔開, 可參考上面例子
  • HostName 寫的是服務器的 ip
  • User寫的是你ssh 登入時的用戶名
  • IdentifyFile寫 私鑰的位置 就行

對了, 在mac 上修改 .ssh/config 文件 是不需要重啟 ssh 服務的, 儲存後就會自動刷新

導入 GitHub ssh key

總體差不多, 可以參考下面的例子

1
2
3
4
5
# GitHub
Host github.com
HostName github.com
User git
IdentityFile <path-to-key>

添加完後ssh 一下github 做個測試

1
ssh [email protected]

如果你看到他打印你的 github 用戶名, 就代表你成功了

一些可能會遇到的其他問題

key too open

在嘗試使用私鑰登入服務器時, 系統可能會抱怨私鑰文件權限太開放, 因此拒絕連線

報錯信息類似

1
2
3
Permissions 0777 for '/Users/username/.ssh/id_rsa' are too open.
It is recommended that your private key files are NOT accessible by others.
This private key will be ignored.

解決方法很簡單, 改權限就行了

1
chmod 600 <keyFile>