1. 程式人生 > >ssh免密碼登入全過程

ssh免密碼登入全過程

  1. 生成公鑰和私鑰

     ssh-keygen

    等同於ssh-keygen -t rsa

    執行上面的命令後,系統會出現一系列提示,可以一路回車,例如:

    $ ssh-keygen 
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/glowd/.ssh/id_rsa): Enter

    特別說明,要不要對私鑰設定口令(passphrase),如果擔心私鑰的安全,可以設定一個。沒有特殊需求直接Enter,為空

    執行結束以後, 預設在 ~/.ssh目錄生成兩個檔案:
    id_rsa :私鑰
    id_rsa.pub :公鑰

2.匯入公鑰到認證檔案,更改許可權

  • 匯入本機

     cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys  
    
  • 匯入要免密碼登入的伺服器

  • 首先將公鑰複製到遠端伺服器,使用者為glowd

     scp {-P port} ~/.ssh/id_rsa.pub [email protected]:~  
    
  • 在伺服器上

    cat ~/id_rsa.pub >> ~/.ssh/authorized_keys 
    
  • 在伺服器上更改許可權(必須)

        chmod 755 ~
        chmod 700 ~/.ssh
        chmod 600 ~/.ssh/authorized_keys  

以上執行之後,有些機器應該可以直接訪問了,可以測試一下
ssh {remote ip}

3.常見問題及解決方案

  • 生成金鑰並上傳至遠端主機後,任然不可用
    開啟伺服器的 /etc/ssh/sshd_config 這個檔案,取消註釋。
#AuthorizedKeysFile .ssh/authorized_keys
  • 重啟伺服器的ssh服務。
#RHEL/CentOS系統
$ service sshd restart
#ubuntu系統
$ service ssh restart
#debian系統
$ /etc/init.d/ssh restart
  • 執行ssh-copy-id 命令
 ssh-copy-id [email protected] ip
 `如果不是預設埠22,是9001`
 ssh-copy-id -p 9001 [email protected] ip
  • ssh連線遠端主機時,出現 sign_and_send_pubkey: signing failed: agent refused operation 錯誤,並且還是需要輸入密碼

表示ssh-agent 已經在運行了,但是找不到附加的任何keys,就是說你生成的key,沒有附加到ssh-agent上,需要附加一下,執行

  • 檢視hosts中是否配置了git伺服器的地址,那樣的話,會一直讓你輸入密碼
ssh-add
`當然你也可以檢視附加了哪些key`
ssh-add -l
  • 結果就可以了
ssh glowd@{remote ip}
`或者,使用9001埠`
ssh -p 9001 [email protected]{remote ip}
  • 如果顯示下面的錯誤
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The ECDSA host key for [git.bbdservice.net]:51668 has changed,
and the key for the corresponding IP address [10.10.80.26]:51668
is unknown. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
6e:92:c8:d6:f2:45:ae:ff:5f:1d:21:8b:01:52:8a:82.
Please contact your system administrator.
Add correct host key in /home/glowd/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/glowd/.ssh/known_hosts:1
  remove with: ssh-keygen -f "/home/glowd/.ssh/known_hosts" -R [git.bbdservice.net]:51668
ECDSA host key for [git.bbdservice.net]:51668 has changed and you have requested strict checking.
Host key verification failed.
fatal: Could not read from remote repository.

說明你連線的那一行訪問,驗證已經改變,/home/glowd/.ssh/known_hosts:1,刪除那一行,或者直接把整個known_hosts檔案刪除,重新連線一次就好了

4.前面搞定了免密碼登入,想想也是很激動了。但是,還要寫ip,還要寫使用者名稱,是不是又有點不爽啦。搞定使用者名稱和埠號

找到 ~/.ssh/config 檔案,如果木有的話就自個兒建一個吧,內容如下:

Host {remote ip}
User {username} 
Port {port}
  • 現在連線就很簡單了
    ssh {remote ip}

5.我現在已經可以ssh 到某臺機器,並且不用輸入使用者名稱,密碼了。但是我現在要使用github,或者github,怎麼辦了。

  • 看網上有些人說,不同的賬號,要生成不同的公匙,私匙,也是有解決方案的

    假設github,我的賬號是 [email protected]

$ ssh-keygen -t rsa -C "[email protected]"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/glowd/.ssh/id_rsa): {輸入你想要儲存密匙的檔名  假設id_rsa_github}
Enter passphrase (empty for no passphrase):{enter}
Enter same passphrase again:{enter}
Your identification has been saved in /home/glowd/.ssh/id_rsa_github.
Your public key has been saved in /home/glowd/.ssh/id_rsa_github.pub.

現在我們去/home/glowd/.ssh/目錄下,發現多了兩個檔案id_rsa_github和id_rsa_github.pub

但是此時如果你把id_rsa_github.pub的內容,拷貝到github的ssh key裡面去,然後連線github

ssh -T git@github.com

會發現結果是
Permission denied (publickey).

那是因為現在ssh還不能識別這個密匙-key

想要識別這個key也很簡單

ssh-add /home/glowd/.ssh/id_rsa_github
`如果你想檢視現在有那些key可以識別`
ssh-add -l

現在有你的key了,執行

ssh -T git@github.com

會顯示你成功通過驗證了並且登入,但是GitHub沒有提供shell訪問,意思不能使用登入後的命令列操作github

Hi Glowdable! You've successfully authenticated, but GitHub does not provide shell access.

  • 現在好了,我有兩個key,一個ssh 伺服器,一個github。但是我們公司也有gitlab,那麼我還要再生成一個key,用gitlab的賬號嗎?

當然如果你願意是沒有問題,而且網上很多同學也是這樣說的,但是這是沒有道理的。

  • 首先,我們生成的key,並不和賬號繫結,雖然我們看到,生成key時好像使用了賬號,其實那不是賬號,那只是comment-註釋。就是說,無論你寫什麼,都不會對生成的key產生影響
ssh-keygen -C "[email protected]"
  • 那麼,我們看到最後生成的key裡面,是包含了這個comment的。這是事實,不過在驗證時,[email protected]後面的這部分是沒有作用的,你可以任意修改。
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDZhsxICWPITRpvOTosjTmuo2osYAIet2DdjBZ/qoLcU6TZtrojIt17I48fYnm4eq9LI1jF7kG+ZwiuAuChRVl2VEOhGsgkk3xG10lQEpJt2RHSxaBfaVwu0BpwJ0bCaFIq/W73WxeWE2AzuG7/V+QjwtvBBQMFKrZ3nbgifgsndrT8KdE/pCGxuxgB5Xx5Y7mdAwxhHzseB9Yl+gCgstjMDe1FjTkRibQ9uQZKSoTKLxQZ+NZC7Ylniv21/CO105XwM0CF4wGlei0FE9bn7cs/1SNxM1Aae67eYADkfSvQIkRS6yvtJ4YxrZ9Xsdw7smy8kJ1wBqhDFMz1FMZp5oDh glowd@gmail.com
  • 結論:金鑰不和任何comment繫結,任何地方使用都是一樣的,嚴格來說,如果沒有特殊需求,一個就夠了。系統預設在校驗的時候就會讀取ssh-add -l中key所對應的金鑰檔案