2012-01-02 32 views
10

Kendinden imzalı bir sertifika kullanan bir SSL etkinleştirilmiş sunucuya bir Android uygulaması bağlamaya çalışıyorum. Zaten onlarca öğreticiden okudum ve uygulama şimdi sunucuya bağlanan & sertifikasını kabul ediyor, ancak hiçbir zaman bir veri geri alamıyorum.Kendinden imzalı sertifika ile Android'de SSL-Socket oluşturun

i soket başlatmak için kullanılan orijinal kod şudur: Daha sonra

//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); 

, alıcı ipliğin çalışma döngüsü giriş akışı ulaşmak için socket.getInputStream() kullanır. Şifrelenmemiş bir bağlantı kullandığım sürece, bu sorun olmadan çalışır. Ancak güvenli bağlantı soketinden herhangi bir veri almaz. Alma döngüsüne günlük iletileri ekleyerek bunu doğruladım ve hatta kontrol etmek için OpenSSL'nin s_server'ini kullandı. İstemciden veri aldım, ancak müşteri ona gönderdiğim hiçbir şeyi almadı. Ben sunucudan şey almak

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

aynı sonucu, bağlantı eserler ancak InputStream kullanarak: son test olarak

, böyle www.google.com:443 bir bağlantı açmaya çalıştı .

Herhangi bir fikri olan var mı?

DÜZENLEME: Şu anda kendi soruyu cevaplamak için izin yok, ama burada cevabı

: Aslında sorun alma döngü WAS çıkıyor. Okumak için bayt sayısını almak için InputStream.available()'a güvendim, ancak bunun güvenilir olmadığının farkında olmadım (her zaman SSL soketi için 0 döndürür). Bu nedenle, bunun yerine, engelleme read() kullanmak için alma döngüsünü değiştirdim.

cevap

7

Yukarıda belirtildiği gibi: Sorun, alma döngüsünde WAS işlevini kapatır. Okumak için bayt sayısını almak için InputStream.available()'a güvendim, ancak bunun güvenilir olmadığının farkında olmadım (her zaman SSL soketi için 0 döndürür). Bu nedenle, bunun yerine, engelleme read() kullanmak için alma döngüsünü değiştirdim.

+0

Biri veri göndermek için diğeri almak için iki iş parçacığına sahip olmak uygun mu? – snapfractalpop

+2

Evet, bence, özellikle iki yönlü iletişimi kullanıyorsanız, iki iş parçacığı kullanmalısınız. Bir kaç yazıyla da okudum, okuma ve yazma için farklı akışlar kullandığınız için bu oldukça güvenli olmalıdır. – mistalee

İlgili konular