2012-01-02 3 views
10

자체 서명 된 인증서를 사용하는 SSL 지원 서버에 Android 앱을 연결하려고합니다. 이미 수십 개의 자습서를 읽었으며 응용 프로그램은 이제 서버에 연결하는 인증서 &을 수락하고 있지만 어떤 데이터도 다시 얻지 못합니다.자체 서명 된 인증서로 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를 사용하여이를 확인했다. 클라이언트에서 데이터를 가져 왔지만 클라이언트는 내가 보낸 데이터를받지 못했습니다. 내가 서버에서 아무것도받지

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

같은 결과, 연결 작동하지만, InputStream 인을 사용 : 마지막 테스트로

는,이 같은 www.google.com:443에 대한 연결을 열려고 .

아무도 아이디어가 없습니까?

편집 : 나는 현재 내 자신의 질문에 대답 할 수 아니지만, 여기에 답이 있어요

는 : 음, 문제가 수신 루프 WAS 밝혀졌습니다. 나는 읽을 바이트 수를 얻기 위해 InputStream.available()에 의지했지만, 신뢰성이 낮다는 것을 깨닫지 못했습니다 (항상 SSL 소켓에 대해 0을 반환합니다). 그래서 수신 루프를 차단 대신 read()을 사용하도록 전환했습니다.

답변

7

위에서 언급 한 것처럼 : 문제가 발생하여 수신 루프가 발생했습니다. 나는 읽을 바이트 수를 얻기 위해 InputStream.available()에 의지했지만, 신뢰성이 낮다는 것을 깨닫지 못했습니다 (항상 SSL 소켓에 대해 0을 반환합니다). 그래서 수신 루프를 차단 대신 read()을 사용하도록 전환했습니다.

+0

두 개의 스레드, 하나는 데이터 전송 용이고 다른 하나는 수신 용입니까? – snapfractalpop

+2

예, 전이중 통신을 사용하는 경우 특히 두 가지 스레드를 사용해야합니다. 두 글을 읽었습니다. 읽기와 쓰기를 위해 다른 스트림을 사용하고 있기 때문에 상당히 안전한 스레드이어야합니다. – mistalee

관련 문제