---
title: 如何使用 SSH 私鑰進行 ssh 連線
---
# 如何使用 SSH 私鑰進行 ssh 連線
## 準備金鑰
:::info
你可以在本機端產生金鑰, 然後將公鑰 (public key) 上傳到 server.<br />或者也可倒著做, 在 server 產生金鑰, 將私鑰 (private key) 下載下來, 並刪掉 server 上的私鑰.
:::
下面是在本機產生金鑰. 在主機產生金鑰請自行腦補.
### 建立金鑰
先在本機端使用 `ssh-keygen` 指令建立金鑰 (`open-ssh` 套件, win10 裡應該有):
```bash
ssh-keygen
```
請依照指令提示輸入要建立的金鑰檔名 (`ssh-keygen` 會將金鑰建立在當前目前目錄下. 或直接按 Enter 也行, 檔名及位置則如提示):
```bash
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\user001/.ssh/id_rsa):
```
輸入**保護私鑰**用的密碼, 直接按 Enter 表示私鑰檔不加密.
```bash
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```
完成建立出現的訊息:
```console
Your identification has been saved in svr_xxx.
Your public key has been saved in svr_xxx.pub.
The key fingerprint is:
SHA256:3UJS9bgwPVqoIsRajmRUTcL6YOWFmapzJvDDR/JAcow user001@myWin10
The key's randomart image is:
+---[RSA 2048]----+
| o.oo*. ... |
|E.+.*.o . o o |
| +o=+. . = = . |
|.oB*o = * o |
|.=oBo . S + o |
|+ * +. . . |
| = o |
| |
| |
+----[SHA256]-----+
```
此時會產生二個檔案, 一個公鑰 (`"svr_xxx.pub"`) 另一個是私鑰 (`"svr_xxx"`), 如果輸入的檔名是 `svr_xxx`.
### 複製公鑰到遠端 linux 主機
可以使用下列指令一氣呵成: 登入 linux 主機, 並將自己的公鑰上傳到主機上的正確位置上. (請將 `svr_xxx.pub`, `host_name` 以及 `user_name` 改成自己的公鑰檔名, linux 主機名稱 (或者是 ip) 及登入的帳號):
```bash
cat svr_xxx.pub | ssh user_name@host_name "mkdir ~/.ssh && cat >> ~/.ssh/authorized_keys"
```
:::info
第一次設定也可以用 `scp` 指令, (上面的作法用於 `authorized_keys` 裡已經有其他內容了, 使用 `scp` 指令會把原有的內容覆蓋掉了)<br /> `scp svr_xxx.pub user_name@host_name:~/.ssh/authorized_keys`
:::
---
## 修改遠端 linux 主機 sshd 的設定
### 確認 sshd 的設定
確認遠端 linux 主機的 sshd 設定:
```bash
$ sudo vi /etc/ssh/sshd_config
```
* 確認設定檔裡有開啟金鑰認證登入
```
PubkeyAuthentication yes
```
* 確認裡面有設定可用的公開金鑰檔名及位置:
```
AuthorizedKeysFile .ssh/authorized_keys
```
:::info
* 第一次設定請先略過**關閉密碼認證登入**, 直接重啟 `sshd`. 等確定可以用私鑰連線之後再進行.
* 如果沒有修改 `sshd_config` 的設定, 就不需要重啟 `sshd`.
:::
### 關閉密碼認證登入
我們甚至也可以設定**關閉**密碼認證登入, 只允許金鑰認證
```
PasswordAuthentication no
PubkeyAuthentication yes
```
:::danger
上面**關閉密碼認證登入**的動作請在確認可以用私鑰成功登入主機之後再進行.
:::
### 重啟 sshd
設定修改完成之後, 重啟 sshd.
* RHEL/CentOS 用戶請用以下指令
```bash
$ sudo sysemctl restart sshd
```
* Ubuntu 用戶
```bash
$ sudo sysemctl restart ssh
```
---
## 使用私鑰登入遠端主機
### 使用 ssh 連線
ssh 連線時指定私鑰檔.
```bash
ssh -i "svr_xxx" user_name@host_name
```
此時應該可以不必輸入**密碼**就直接連上主機.
### 修改本機端 ssh 設定
連線測試成功之後, 可修改**家目錄**下的 `.ssh/config` 將使用私鑰的設定加到設定裡.
```
Host 192.168.33.10
User user_name
IdentityFile ".ssh/private_key/svr_xxx"
Host host_name
HostName 192.168.33.10
User user_name
IdentityFile ".ssh/private_key/svr_xxx"
```
`.ssh/config` 檔裡面是遠端主機的相關設定, 如: ip 地址, 使用哪一個帳號...等等
* `Host`: 輸入的是我們在 `ssh` 指令輸入的**主機代號** (不一定是主機域名, ip 也可以, 甚至同一部主機我們需要以不同的帳號連進去時, 也可以自己取一個代號)
* `User`: 則指定連線這部主機時用什麼用戶帳號
* `Port`: 指定這部主機的 SSH port 號碼.
* `HostName`: 則是輸入 DNS 域名, 或者直接輸入 ip 地址 (如果沒有 DNS 可以幫你 name 轉 ip 時. 例如: 區域網路 (LAN) 中的主機或者自己肚子裡的 VM).
* `IdentityFile`: 指定私鑰檔 (private key) 的位置.
:::info
設定二組**代號**是方便我們用主機名字 (host_name) 或 ip address (192.168.33.10) 都可以自動使用私鑰
:::
使用 `putty` 或者其他軟體 `mobaXterm` 都有類似的設定, 請自行類推.
###### tags: `ssh`, `private key`, `ssh server settings`, `ssh 主機設定`, `使用私鑰連線 ssh`