2012-01-09 162 views
1

我試圖使用https連接到服務器,當我這樣做時說連接需要客戶端證書。如果我按是繼續,我會得到一個TLSAlertException。
連接代碼看起來是這樣的:BlackBerry上的默認客戶端證書

SecureConnection con = (SecureConnection)Connector.open("ssl://url:443"); 

我看在模擬器證書(並在設備上),並且不會有任何默認客戶端(個人)證書。我試過通過代碼生成一個,但我不知道如何使它顯示在手機上的個人證書下。

我發現this但沒有任何選項非常需要在設備上獲得個人證書。

那麼,是否有可能在模擬器上獲得個人證書,理想情況下是通過代碼?
如果我能夠得到一個SecureConnection將連接到服務器時自動使用它?
如果沒有圖書館可以使這項工作?

回答

1

因此,在做了更多的挖掘之後,我找到了Bouncy Castle TLS API。長話短說它似乎到目前爲止,但我會列出我經歷的步驟,因爲我一路上碰到了一些障礙。

您可以從http://www.bouncycastle.org/latest_releases.html下載源文件以及類文件的zip文件。在「Sources and Javadoc」部分,有J2ME的鏈接。

首先,我嘗試將cldc_classes.zip作爲外部JAR添加到構建路徑中。現在,Eclipse的代碼完成工作在Eclipse中。所以我開始模擬器,但是當我嘗試啓動應用程序時,它給了我「錯誤啓動應用程序:Module'cldc_classes.zip'not found。」我四處搜索,發現問題在於我需要檢查構建路徑設置的「訂單和導出」選項卡上的框。哎呀!

所以我檢查了它並試圖再次運行,但在模擬器啓動之前得到了「錯誤:預驗證失敗」。一些更多的搜索顯示,我不得不預先驗證zip文件的工作,似乎很容易。

使用preverify工具給出了很多錯誤和警告,看起來像是他們與java包中類的重複創建有關。在Bouncy Castle常見問題解答中,他們提到了類似的內容,並建議混淆代碼。

我發現了一個java混淆器,經過一番小小的調整就可以混淆這些類。試圖預驗證,並再次失敗......我不想學習比預先驗證更多,所以我決定只導入源文件。

其中一個軟件包有依賴於ArrayList的錯誤,但它似乎沒有必要,我只是刪除它。試圖運行它有一個關於「重複屬性不匹配:'MIDlet-name'」的錯誤。在其中一個包中有一個.jad文件,爲了擺脫這個錯誤,我刪除了這個文件。測試包也可以被刪除而沒有後果。

試圖現在運行我得到了「Eclipse I/O錯誤:無法運行程序」jar「:CreateProcess error = 2」。一些搜索顯示我需要將java jdk bin文件夾(類似於C:\ Program Files \ Java \ jdk \ bin)添加到PATH環境變量中。

最後我能夠運行,並且能夠成功地連接,發送和接收數據。在項目中使用彈性城堡罐可能有更好的/簡單的方法,現在我知道代碼實際上可以工作了。以下是連接的一些示例代碼。

SocketConnection con = (SocketConnection)Connector.open("socket://url:443"); 
TlsProtocolHandler tph = new TlsProtocolHandler(con.openInputStream(), con.openOutputStream()); 
tph.connect(new AlwaysValidVerifier()); 
is = tph.getInputStream(); 
os = tph.getOutputStream();