자체 서명 된 인증서를 사용하는 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()
을 사용하도록 전환했습니다.
두 개의 스레드, 하나는 데이터 전송 용이고 다른 하나는 수신 용입니까? – snapfractalpop
예, 전이중 통신을 사용하는 경우 특히 두 가지 스레드를 사용해야합니다. 두 글을 읽었습니다. 읽기와 쓰기를 위해 다른 스트림을 사용하고 있기 때문에 상당히 안전한 스레드이어야합니다. – mistalee