[英]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.