一、問題描述
在用Linux終端使用ssh root@server_ip來連接到遠程服務器時,出現Permission denied (publickey).提示
二、問題原因
2.1 ssh連接
- 本地生成的一對秘鑰,私鑰(
~/.ssh/id_rsa
)和公鑰(~/.ssh/id_rsa.pub
) - 公鑰(
~/.ssh/id_rsa.pub
)應該保存在遠程服務端的已認證的秘鑰文件內(~/.ssh/authorized_keys
) - 連接過程:
- 1、本地向遠程服務端發起連接
- 2、服務端隨機生成一個字符串發送給發起登錄的本地端
- 3、本地對該字符串使用私鑰(
~/.ssh/id_rsa
)加密發送給服務端 - 4、服務端使用公鑰(
~/.ssh/id_rsa.pub
)對私鑰加密后的字符串進行解密 - 5、服務端對比解密后的字符串和第一次發送給客戶端未加密的字符串,若一致則判斷為登錄成功
2.2 問題分析
分析登錄過程,Permission denied(publickey)的問題可能如下
1、遠程服務器沒有添加公鑰(無法認證)
2、遠程服務器公鑰文件夾權限錯誤(.ssh
和.ssh/authorized_keys
需要保證只有用戶自己有權限,否則驗證無效)
三、問題解決
3.1 公鑰沒有添加
如果服務器端根本就沒有添加公鑰是斷然不可能通過認證的
Solution
1、客戶端已經有秘鑰對:通過其它方式登錄到遠程服務器,查看~./ssh/authorized_keys
文件中是否添加了公鑰,若沒有可直接將公鑰內容拷貝到該文件末尾
2、客戶端沒有秘鑰對:通過ssh-keygen
命令生成秘鑰對,默認文件夾是~/.ssh
文件夾,將.ssh
文件夾內id_rsa.pub
的內容拷貝到服務器上的~./ssh/authorized_keys
文件末尾(若服務器上~./ssh/authorized_keys
不存在則也可以使用ssh-keygen
來生成文件結構)
3.2 遠程服務器.ssh權限問題
遠程服務器~/.ssh
文件夾及其文件權限不對,包括
1、~./ssh/authorized_keys
文件權限
2、~/.ssh
文件夾權限
3、~/.ssh
文件夾所有權
Solution
通過其它方式登錄到遠程服務器,如果是阿里云則可以在網頁中通過驗證之后打開一個終端,然后進行如下操作
- 更改文件所有權
$ chown -R your_user:your_group ~/.ssh
//我用root登錄,your_user是root
- 更改
.ssh
文件夾權限
$ chmod 700 ~/.ssh
- 更改
.ssh/authorized_keys
文件權限
$ chmod 600 ~/.ssh/authorized_keys
四、備注
感謝評論區提醒,上文所有的~符號均為英文符號