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 요청한 대상에 대한 유효한 인증 경로를 찾으려면
진행 방법에 대한 제안 사항은 무엇입니까?
JSCH javadoc은 BTW 내가 여기에 위의 코드를 발견 :
내가 여기 설명되어 Java Secure Channel (JSCH)를 사용하여 종료 http://www.lusta.hu/2011/07/25/securing-nio-java-ssl- 튜토리얼/ – Marc
이 코드는 NIO/BIO를 사용하지 않고서도 할 필요가없는 'SSLContext'를 초기화하기위한 것입니다. 또한 trustmanager에 대해 clientKeyStore를 사용하는 것이 반드시 필요한 것은 아닙니다. TMF에서는 "SunX509"대신에'TrustManager.getDefaultAlgorithm()'을 사용하는 것이 더 좋습니다 (기본값은 SunX509가 아니기 때문에 PKIX입니다). – Bruno