2013-08-13 2 views
3

Java NIO 라이브러리를 사용하여 원격 서버에 연결하는 코드가 있습니다. 콜백과 비동기 적으로 연결하는 코드를 작성 했으므로 호스트가 일반 TCP 서버 일 때 유용합니다. 그러나 서버가 SSL을 사용할 때, 나는 수정을해야만하는 것처럼 보입니다. 내가하고 싶은 일은 서버 인증서가 유효한지, 즉 인증 기관이 발급했는지 만료되지 않았는지 확인하기 위해 SSL을 설정하는 것입니다. 나는 그것보다 더 광범위한 것을하고 싶지 않다. (이름 검사 같은). 즉, 나는 아주 기본적인 SSL 동작을 원한다. 또한 Android에서이 작업을 실행할 계획이므로 외부 키 저장소와 클라이언트 쪽에서 모두 번거롭게 수행 할 수 없습니다. 나는 앱에 내부적으로 필요한 모든 것을하고 싶다. 내가 위대 할 수있는 외부 인증서 파일을 피할 수 있다면.NIO 소켓 클라이언트에 SSL을 어떻게 추가합니까?

계속 진행하려면 정확히 내가해야 할 일에 대해 고민하고 있습니다.

private void setupSecurity() { 
    SecureRandom secureRandom = new SecureRandom(); 
    secureRandom.nextInt(); 

    KeyStore clientKeyStore = KeyStore.getInstance("JKS"); 
    clientKeyStore.load(new FileInputStream("client.jks"), "KeyStorePassword".toCharArray()); 

    TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); 
    tmf.init(clientKeyStore); 

    KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); 
    kmf.init(clientKeyStore, "KeyInKeystorePassword".toCharArray()); 

    sslContext = SSLContext.getInstance("TLS"); 
    sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), secureRandom); 
} 

그리고이 후

가 수동으로 구현되어야 분명히 끔찍한 SSL의 handshke 코드의 무리가 다음과 같이 내가 여기에 몇 가지 NIO 소켓 설정 코드를 발견했다. 위 코드의 문제점은 client.jks 파일 내부에 내가 무엇을 가져야하는지 전혀 모른다는 것입니다. 나는 어떤 종류의 키 스토어 파일을 가지고 있어야하는 것을 원하지 않는다.

SSL 소켓을 구현한다고 주장하는 Naga라는 라이브러리를 발견했지만 설정 한 SSL 소켓 서버에서 작동하지 않습니다. 예외가 발생합니다. sun.security.provider.certpath.SunCertPathBuilderException : unable 요청한 대상에 대한 유효한 인증 경로를 찾으려면

진행 방법에 대한 제안 사항은 무엇입니까?

+0

JSCH javadoc은 BTW 내가 여기에 위의 코드를 발견 :

내가 여기 설명되어 Java Secure Channel (JSCH)를 사용하여 종료 http://www.lusta.hu/2011/07/25/securing-nio-java-ssl- 튜토리얼/ – Marc

+1

이 코드는 NIO/BIO를 사용하지 않고서도 할 필요가없는 'SSLContext'를 초기화하기위한 것입니다. 또한 trustmanager에 대해 clientKeyStore를 사용하는 것이 반드시 필요한 것은 아닙니다. TMF에서는 "SunX509"대신에'TrustManager.getDefaultAlgorithm()'을 사용하는 것이 더 좋습니다 (기본값은 SunX509가 아니기 때문에 PKIX입니다). – Bruno

답변

1

그 자체로 농담이 아닌 SSLEngine,을 사용해야하며 수정이 가능하지만 안드로이드에서 제대로 작동하는지 확신 할 수 없습니다. SSLEngine은 상태 머신이며 많은 구현 작업을 필요로합니다. 솔직하게 해냈다. 나는 그것을 잊어서 사용하지 않을 것이다. SSLSockets.

-3

이것은 실제로 앞에서 논의되었다 : SSH library for Java.

+1

SSH는 SSL과 어떤 관련이 있습니까? – Bruno

+0

@Bruno (한 번)보다 정확하기 때문에 (a) 여기서는 '여기서 논의하지 않았습니다.'(b) SSH는 SSL이 아닙니다. -1. – EJP

관련 문제