最近在嘗試用 VS code的Remote-ssh,但每次都需要輸入密碼很麻煩,想說直接用key登入,就不用輸入密碼。
Client端
首先要產生ssh key pair:
ssh-keygen
-t 使用特定演算法 [ dsa | ecdsa | ed25519 | rsa | rsa1 ]
-e 指定key的長度,單位是 bits
之後會讓你輸入key要存在哪邊,這邊可以輸入想要儲存的地方和名稱,再來會詢問要不要輸入 passphrase ,輸入的話之後用這個key都要輸入。當然我們用key是懶癌末期了不想輸入,所以直接按Enter跳過。
最後會產生一個private key YOUR_KEY_NAME 和一個public key YOUR_KEY_NAME.pub
private key 就是我們登入server用的key,所以public key我們要丟到server的 ~/.ssh/authorized_keys。
ssh-copy-id -i ~/.ssh/YOUR_KEY_NAME.pub USER_NAME@SERVER_HOST
需要先輸入密碼後會幫你把public key加到 authorized_keys 裡。
Server端
先確定兩點
~/.ssh 目錄權限是 700 ,只能夠被你 讀、寫、以及執行。
authorized_keys 是 600 ,只能夠被你 讀、寫。
再來查看server ssh的設定:
sudo vi /etc/ssh/sshd_config
確認以下兩個設定:
PubkeyAuthentication yes #公開金鑰認證登入方式
AuthorizedKeysFile .ssh/authorized_keys #公開金鑰檔案位置
甚至把密碼登入方式關掉:
PasswordAuthentication no
最後重新啟動ssh服務。
理論上這些做完就應該可以直接使用private key登入server
ssh -i ~/.ssh/YOUR_KEY_NAME USER_NAME@SERVER_HOST
Debug
但事情通常不會這麼簡單,Google得到的方法都做了,他還是叫我用密碼登入。最後找到了ssh debug的方式,在server端輸入:
sudo $(which sshd) -p 6666 -d
-p 使用6666 port
-d debug模式
然後在client端用ssh在連一次server,但這次加上 -p 6666 和 -v
ssh -p -v 6666 -i ~/.ssh/YOUR_KEY_NAME USER_NAME@SERVER_HOST
可以在client端和server端看到ssh分別做了什麼事,最後發現在server端有個訊息
Authentication refused: bad ownership or modes for directory /SSH_PARENT_PATH
說我的根目錄權限有問題,確認後才發現根目錄的權限是 775 ,表示除了我自己擁有讀寫執行的權限外,跟我同個group得使用者也一樣能對我的根目錄操作讀寫執行,應該是檔案權限太鬆,改成 755 就可以了。