2011-10-05 105 views
6

我想從另一臺ssh服務器後面ssh進入服務器。網關服務器需要用戶名/密碼,我可以這樣做。我正在使用隧道進入下一臺服務器,但這需要只有一個ssh密鑰。我通過PuTTY生成了密鑰,所以它存在於我的用戶名中,但我不確定如何爲我的Java程序檢索它。它是一種配置嗎?即setConfig(「userauth.publickey」,「com.jcraft.jsch.UserAuthPublicKey」),那麼我該如何使用這個或其他東西?文檔似乎很少,我很感激任何幫助。我試過的任何東西都會給我一個錯誤:當我連接此會話時出現「驗證失敗」JSch:如何使用SSH密鑰ssh進入服務器

謝謝!

我使用的隧道方法是:http://sourceforge.net/apps/mediawiki/jsch/index.php?title=ProxySSH非常感謝寫這篇文章的人!

對於上下文,我想從我的Android手機讀取/寫入學校的服務器。

回答

9

要啓用public-key authentication,您必須使用JSch.addIdentity方法之一。

這些採用OpenSSH密鑰格式的公鑰和私鑰 - 所以請確保以這種格式從PuTTY導出它。 (JSch不理解PuTTY的本地格式,儘管您可以編寫一個實現Identity接口的適配器,自己解析它)。

添加到JSch的身份是全局的,而不是每會話。這通常不是問題,因爲JSch會嘗試所有自身和服務器都支持的身份驗證方法,公鑰驗證通常在密碼驗證之前進行。

所有身份驗證方法都需要一個用戶名(通常是要登錄的帳戶的名稱)。

使用公鑰認證時,公鑰必須先前可用於服務器。對於OpenSSH的sshd,公鑰應在~/.ssh/authorized_keys中列出。 (如果你只有一個公鑰,只需把它複製到這個文件中,如果你有多個(每個都允許),每個都應該在一行上。)

因此,它應該運行時間不足,設置身份後的框。

如果你想確保第一會話使用密碼認證和第二(隧道)一個使用公共密鑰,您可以使用每個會話的配置,覆蓋全球的一個:

tunnelSession.setConfig("PreferredAuthentications", "password"); 

innerSession.setConfig("PreferredAuthentications", "publickey"); 

(這些是逗號分隔的列表,這裏每個都有一個元素。)

關於ProxySSH示例,這是我的(在JSch的作者Atsuhiko Yamanaka的幫助下)。也許,我應該將這些信息添加到Wiki頁面。

+0

由於第二個SSH不接受用戶名,因此在實例化會話時應該如何使用該字段?一個空字符串或null?即jsch.getSession(WHAT_GOES_HERE?,主機名,22); – Choobs

+0

我不斷收到Auth Fail錯誤。我有本地存儲的id_rsa和id_rsa.pub,我使用PuTTYgen導出爲OpenSSH密鑰,然後在addIdentity(...)中使用它。我錯過了什麼嗎?在第一臺服務器上有一個/.ssh/authorized_keys文件,它是id_rsa.pub的副本,如果相關的話。 – Choobs

+0

您*一直*需要SSH用戶名 - 如果沒有這個,您將無法登錄到服務器。 (畢竟,發送的命令必須在某個本地用戶帳戶中執行。)和'。ssh/authorized_keys'文件(包含允許登錄的公共密鑰)必須位於用戶的主目錄中,您要登錄。 –