---
# System prepended metadata

title: 設定 Linux 使用 SSH Key-based 登入驗證方式
tags: [Linux]

---

設定 Linux 使用 SSH Key-based 登入驗證方式
===

###### tags: `Linux`

## SSH Key-based
兩個步驟：

產生 SSH 登入用的金鑰
將產生的 Pub key 放到伺服器的 authorized_keys 清單中

### 1. 產生金鑰
先切換到 ~/.ssh  目錄下，通常金鑰都會收集起放在這個目錄下。若該目錄不存在，就自己建一個，並設定正確的權限：

```permission=
$ mkdir ~/.ssh 
$ chmod 700 ~/.ssh
```

然後以 ssh-keygen 產生金鑰：

```keygen=
$ ssh-keygen
```

在產生金鑰的過程中，會詢問一些問題，如果沒有特殊需求可以全部使用預設值（按 Enter）就好：

```Q1=
1. Enter file in which to save the key (/home/username/.ssh/id_rsa): /home/username/.ssh/tn_key
```
第 1 個問題是問你金鑰儲存的位置與檔名，預設檔名是 id_rsa ，不過這實在看不出這把金鑰的用途，所以習慣上我會更改檔名。

```Q2Q3=
2. Enter passphrase (empty for no passphrase): 
3. Enter same passphrase again: 
```
第 2 與第 3 個問題則是指定金鑰保護密碼。若有設定密碼的話，之後每次使用這把金鑰時就要輸入密碼，因此請務必牢記密碼。忘記密碼就只能重新產生金鑰了，所以別給自己找麻煩 :)

最後看到 fingerprint 與 randomart ，就代表產生成功了。

```f=
Your identification has been saved in /home/username/.ssh/tn_key.
Your public key has been saved in /home/username/.ssh/tn_key.pub.
The key fingerprint is:
.....
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
...
|                 |
|                 |
+----[SHA256]-----+
```

### 2. 將公開金鑰上傳
產生的金鑰會有兩把一把是公開金鑰（Public Key）、一把是私密金鑰（Private Key）。

公開金鑰（Public Key）：這把是對外公開的金鑰，之後把它上傳到伺服器上使用。

私密金鑰（Private Key）：這把則是放在自己電腦的金鑰，它等同於你的密碼，請務必保護好。此外，私鑰在使用時，權限僅能是 400、 600 或 700，否則會出現下列的錯誤訊息：

```
Permissions for {{filename}} are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
```

上傳金鑰的方法有幾種，個人偏好第 1 種與第 2 種，因為一條指令就搞定了：

```first=
$ ssh user@host 'mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys' <  /home/username/.ssh/tn_key.pub
```

也可以用 ssh-copy-id ，指令最短：

```second=
$ ssh-copy-id -i ~/.ssh/tn_key.pub user@host
```
真的不想記指令的話，就把金鑰傳上去，在寫過去 authorized_keys 。不過說真的這條就是把第 1 種上傳方式拆開下而已：

```third=
$ scp ~/.ssh/tn_key.pub user@host:~/.ssh/
$ ssh user@host
$ cat .ssh/tn_key.pub >> .ssh/authorized_keys
```

### 3. 停用密碼認證登入
如果公開金鑰認證設定完成後，想關閉密碼登入的方式，可以修改伺服器上的 /etc/ssh/sshd_config 的設定

```change=
# Change to no to disable tunnelled clear text passwords
PubkeyAuthentication yes
- # PasswordAuthentication yes
+ PasswordAuthentication no
把 PasswordAuthentication 註解打開並將值改成 no，另外檢查 PubkeyAuthentication 是否為 yes，修改完記得重起 sshd 。
```
```restartsshd=
$ systemctl restart sshd
or
$ service ssh restart
```
## 失敗可能原因
### 1、許可權問題

.ssh目錄,以及/home/當前使用者 需要700權限,參考以下操作調整

sudo chmod 700 ~/.ssh

sudo chmod 700 /home/當前使用者

.ssh目錄下的authorized_keys檔案需要600或644許可權,參考以下操作調整

```
chmod 600 ~/.ssh/authorized_keys
```

### 2、StrictModes問題

編輯

sudo vi /etc/ssh/sshd_config

找到

```
#StrictModes yes
```

改成

```
StrictModes no
```

如果還不行,可以用ssh -vvv 目標機器ip 查看詳情,根據輸出內容具體問題具體分析了


## Reference
Tsung (2005-12-28)。ssh keygen 免輸入密碼。檢自 Tsung’s Blog (2019-06-13)。
G. T. Wang (2014-05-18)。SSH 公開金鑰認證：不用打密碼登入 Linux 設定教學，安全又方便。檢自 G. T. Wang (2019-06-13)。