簡體   English   中英

使用自簽名證書在Android上創建SSL-Socket

[英]Create SSL-Socket on Android with self-signed certificate

我正在嘗試將Android應用程序連接到啟用SSL的服務器,該服務器使用自簽名證書。 我已經閱讀了幾十個教程,應用程序現在接受證書並連接到服務器,但我從來沒有得到任何數據。

我用來初始化套接字的原始代碼是這樣的:

//passphrase for keystore
char[] keystorePass="password".toCharArray();

//load own keystore (MyApp just holds reference to application context)
KeyStore keyStore=KeyStore.getInstance("BKS");
keyStore.load(MyApp.getStaticApplicationContext().getResources().openRawResource(R.raw.keystore),keystorePass);

//create a factory
TrustManagerFactory     trustManagerFactory=TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);

//get context
SSLContext sslContext=SSLContext.getInstance("TLS");

//init context
sslContext.init(
    null,
    trustManagerFactory.getTrustManagers(), 
    new SecureRandom()
);

//create the socket
Socket socket=sslContext.getSocketFactory().createSocket("hostname",443);
socket.setKeepAlive(true);

然后,接收器線程的運行循環使用socket.getInputStream()來訪問輸入流。 只要我使用未加密的連接,這沒有問題。 但是安全連接不會從套接字中檢索任何數據 我通過向接收循環添加日志消息來驗證這一點,甚至使用OpenSSL的s_server進行檢查。 我從客戶端檢索數據,但客戶端從未收到我發送給它的任何內容。

作為最后一次測試,我嘗試打開與www.google.com:443的連接,如下所示:

javax.net.SocketFactory fact=SSLSocketFactory.getDefault();
Socket socket=fact.createSocket(_config.getUri().getHost(), _config.getUri().getPort());

仍然是相同的結果,連接工作但使用InputStream我沒有從服務器收到任何東西。

有人有任何想法嗎?

編輯:

我目前不允許回答我自己的問題,但是答案是:嗯,結果問題是接收循環。 我依靠InputStream.available()來獲取要讀取的字節數,但沒有意識到它相當不可靠(對於SSL套接字總是返回0)。 所以我將接收循環切換為使用阻塞read()

如上所述:結果問題是接收循環。 我依靠InputStream.available()來獲取要讀取的字節數,但沒有意識到它相當不可靠(對於SSL套接字總是返回0)。 所以我將接收循環切換為使用阻塞read()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM