使用 RSA 密鑰對進行 SSH 登陸驗證

1. 生成密鑰對


OpenSSH 提供了ssh-keygen用於生成密鑰對,不加任何參數調用便可:算法

[root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.Enter file in which to save the key (/home/xiaq/.ssh/id_rsa):

若是你之前沒有生成過密鑰對,直接回車就行。而後會問你「passphrase」,這是用來加密私鑰的密碼。若是你不知道怎麼用,直接用空密碼也行(固然,這樣會下降安全性)。按兩次回車後密鑰對就生成好了:shell

Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/xiaq/.ssh/id_rsa.2.Your public key has been saved in /home/xiaq/.ssh/id_rsa.2.pub.The key fingerprint is:8a:77:ec:a1:77:42:8d:5d:ab:17:33:ac:87:06:20:3c xiaq@blackieThe key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|   .             |
|    E .     .    |
|     o .S+ o .   |
|     . o+ o *    |
|    . o.+. + +   |
|     . +o.* o    |
|      ...+ o     |
+-----------------+

嗯,會有一堆很花哨的輸出,能夠全都無論。這樣在你剛纔指定的地方就有了一對密鑰,其中私鑰就是上面指定的名字,公鑰則多一個「.pub」後綴。安全

2. 上傳密鑰


把你的公鑰用scp上傳到了遠程遠程ssh服務器,並把公鑰的內容追加到ssh服務器的 ~/.ssh/authorized_keys:
服務器

[root@localhost ~]# scp ~/.ssh/id_rsa.pub user@host:
[root@localhost ~]# ssh user@host
[root@localhost ~]# cat id_rsa.pub >> ~/.ssh/authorized_keys

或者等價地session

[root@localhost ~]# cat ~/.ssh/id_rsa.pub | ssh user@host 'cat >> ~/.ssh/authorized_keys'

再或者dom

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.113

COMMENT: 顧名思義,authorized_keys 裏面能夠存多個公鑰。因此在這裏用 cat id_rsa.pub >> ~/.ssh/authorized_keys。不過,若是你之前沒有這個文件,直接 cp id_rsa.pub ~/.ssh/authorized_keys 也是能夠的……
ssh

若是你的 ~ 下沒有 .ssh 目錄,創建之便可。ide

NOTE: OpenSSH 提供了一個腳本ssh-copy-id用於上傳公鑰。其做用就是自動化完成以上的操做,例如在本身的機器上執行加密

[root@localhost ~]# ssh-copy-id -i .ssh/id_rsa.pub user@remoteserver.com

man ssh-copy-id完整語法 ssh-copy-id [-i public_key] [user@]machinespa

3. ~/.ssh 相關文件權限


爲防止你的私鑰被惡意用戶獲取和/或篡改,以及你的公鑰信息被惡意用戶篡改,ssh 對 ~/.ssh 的文件權限有着嚴格的要求。若是權限不對,公鑰驗證不會正常工做。

NOTE: 準確說來,這取決於 sshd 的配置。但無論怎樣,出於安全性考慮,按以下步驟配置文件權限仍是必要的。

在本地和遠程兩臺機器上,都確認 ~/.ssh 目錄只有你有 rwx 權限,其餘人沒有任何權限:

[root@localhost ~]# pwd/home/xiaq
[root@localhost ~]# chmod 700 .ssh
[root@localhost ~]# ls -dl .sshdrwx------ 2 xiaq xiaq 4096 Jun  6 11:29 .ssh/

在本地機器上,確認私鑰只有你有 rw 權限,其餘人沒有任何權限:

[root@localhost ~]# pwd/home/xiaq/.ssh
[root@localhost ~]# chmod 600 id_rsa 
[root@localhost ~]# ls -l id_rsa-rw------- 1 xiaq xiaq 1679 Apr  1 20:39 id_rsa

相似地,確認遠程機器上的 ~/.ssh/authorized_keys 只有你有 rw 權限:

[root@localhost ~]# pwd/home/xiaq/.ssh% chmod 600 authorized_keys 
[root@localhost ~]# ls -l authorized_keys 
-rw------- 1 xiaq xiaq 394 2011-04-18 13:40 authorized_keys

4. 結束


一切順利的話,你如今就能夠不打密碼直接 ssh 了。

不過,若是你在生成 SSH 密鑰對時,爲了更安全設置了 passphrase 了的話,ssh 登陸時會請你輸入 passphrase。爲了避免用每次都輸,能夠用 ssh-agent 和 ssh-add,在 X會話或登陸session時 ssh-agent 做爲 daemon 啓動,它存儲私鑰用於公鑰認證,其餘程序做爲 ssh-agent 的客戶就能夠在該會話中實現自動認證。Debian, Fedora 上 ssh-agent 已經被自動啓動。

使用 ssh-add 添加私鑰:

ssh-add id_rsa_file

不帶文件參數時,會添加 $HOME/.ssh/id_rsa, $HOME/.ssh/id_dsa 和 $HOME/.ssh/identity。 ssh-add 時須要輸入一次 passphrase。以後在同一次會話中的 ssh 遠程登陸都再也不須要輸入。

5. 公鑰加密原理


公鑰加密 (public-key cryptography),或非對稱密鑰加密 (asymmetric key cryptography) 是一類普遍使用的加密算法。這類算法使用一對密鑰即公鑰 (public key) 和私鑰 (private key)。其中公鑰能夠隨便分發,只用於加密 (encryption),私鑰則只由一人持有,只用於解密。任何一個信息用公鑰加密以後,用私鑰解密便可獲得原來的信息,反之則不必定。

公鑰加密的關鍵點在於,一方面,公鑰加密是可逆的,可是不能用公鑰推斷出私鑰。顯然數學上,已知一個公鑰是可以算出對應私鑰的,可是隻要設計足夠好的加密算法(以及使用足夠複雜的密鑰對),使得不能在能夠接受的時間內破譯便可。

RSA 是一種常見的公鑰加密算法。RSA 的工做原理依賴於以下事實:破譯 RSA 私鑰須要對某些極大的整數進行因數分解,而目前還沒有找到快速的對極大整數做因數分解的算法。換言之,若是有人找到了這樣的算法,那麼全世界的 RSA 加密都會失效。

RSA是由Ron Rivest, Adi Shamir, Leonard Adleman三人在1978年首次提出的。三人並所以項工做榮獲了2002年Turing Award。周時,Rivest仍是算法導論的做者之一,書中在31章對RSA系統的原理進行了簡要說明,系統實現中利用到了數論中的Euler-Fermat theorem

COMMENT: 但無論怎麼,極大整數的因數分解仍是可能的。RSA_Laboratories舉辦過屢次懸賞破譯 RSA 的活動,更多信息能夠看看 RSA_Secret-Key_Challenge

儘管隨着密碼學的發展,RSA 的安全性已經愈來愈受到威脅,可是將來能誕生能夠在多項式時間內破譯 RSA 的可能性仍是很是小的。也就是說,除了軍方、金融等高危目標以外,RSA 仍是適用的。

相關文章
相關標籤/搜索