2010-04-29 78 views
2

我想了解this code中發生了什麼。KeyStore,HttpClient和HTTPS:有人可以向我解釋這段代碼嗎?

KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());   
FileInputStream instream = new FileInputStream(new File("my.keystore")); 
try { 
    trustStore.load(instream, "nopassword".toCharArray()); 
} finally { 
    instream.close(); 
} 

SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore); 
Scheme sch = new Scheme("https", socketFactory, 443); 
httpclient.getConnectionManager().getSchemeRegistry().register(sch); 

我的問題:

trustStore.load(instream, "nopassword".toCharArray());是做什麼的到底是什麼?從閱讀文檔load()將使用一些任意的「nopassword」從輸入流(這只是我們剛剛創建的一個空文件)加載KeyStore數據。爲什麼不加載作爲InputStream參數的null以及作爲密碼字段的空字符串?

然後當這個空的KeyStore被傳遞給SSLSocketFactory構造函數時發生了什麼?這種手術的結果是什麼?

或者 - 這僅僅是一個例子,在真實的應用程序中,您將不得不實際引用現有密鑰庫文件/密碼?

回答

1

或者 - 這只是一個例子,在真實的應用程序中,您實際上必須引用現有的密鑰存儲文件/密碼?

看起來確實如此。沒有"my.keystore"文件分佈在HttpClient 4.0.1的二進制或源代碼發行版中。爲了運行,你需要創建一個真正的密鑰庫。您可以使用keytoolPortecle

本示例說明如何使用與JVM默認爲此示例($ JAVA_HOME/jre/lib/security/cacerts)使用不同信任存儲的DefaultHttpClient實例。當SSL站點使用自己內部簽署的證書certificate authority時,這非常有用。只有在識別出服務器證書的簽名者時才能建立SSL連接。如果您不熟悉這個概念,那麼TLS上的維基百科條目是一個體面的介紹。

2

本示例試圖向您展示如何加載自己的信任庫。爲了讓這個例子起作用,你需要在當前目錄下有一個名爲「my.keystore」的文件,並且密鑰庫的密碼是「nopassword」。

請注意new File("my.keystore")不一定會創建一個新文件。它只是創建一個指向路徑的File對象。

+0

實際上,'new File()'不會創建一個新文件。如果文件不存在,那麼FileInputStream會立即拋出一個異常。代碼暗示您事先創建了一個密鑰存儲庫,給它一個「nopassword」密碼,然後導入一些您信任的SSL證書。然後,您將密鑰庫與您的應用程序一起打包,以便用於驗證證書。 – 2011-03-04 01:01:59

相關問題