Netty를 사용하여 단방향 인증 소켓 서버를 구축하려고합니다.
먼저 keytool을 사용하여 키 저장소, 자체 서명 된 인증서, 서버 및 클라이언트 모두에 대한 truststore를 생성하고 서버/클라이언트에 일부 코드를 작성하면 SSL 인증이 작동합니다.
여기 내 질문 :
내 클라이언트에 truststore를 추가 할 필요가없는 방법이 있습니까? 키 저장소 만 제 서버에 추가하고 여전히 잘 작동합니까? 단방향 인증이란 서버에만 인증서가 있다는 의미입니다. Netty를 사용하는 단방향 SSL 인증
다음
내가 지금까지 SslHandler을 추가 내 서버/클라이언트에 쓴 것입니다 :서버 :
private void addSslHandlerOneWay(SocketChannel ch) throws Exception {
SSLContext sslContext = SSLContext.getInstance("TLS");
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(new File("svrks.jks")), "kspassword1".toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, "kspassword2".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
SSLEngine sslEngine = sslContext.createSSLEngine();
sslEngine.setUseClientMode(false);
sslEngine.setNeedClientAuth(false);//one-way
sslEngine.setEnabledProtocols(sslEngine.getSupportedProtocols());
sslEngine.setEnabledCipherSuites(sslEngine.getSupportedCipherSuites());
sslEngine.setEnableSessionCreation(true);
ch.pipeline().addFirst("SSL", new SslHandler(sslEngine));
}
클라이언트 :
private void addSslHandlerOneWay(SocketChannel ch) throws Exception {
SSLContext sslContext = SSLContext.getInstance("TLS");
KeyStore ts = KeyStore.getInstance("JKS");
ts.load(getInputStream("clits.jks"), "tspassword2".toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ts, "tspassword1".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ts);
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
SSLEngine sslEngine = sslContext.createSSLEngine();
sslEngine.setUseClientMode(true);//client
sslEngine.setEnabledProtocols(sslEngine.getSupportedProtocols());
sslEngine.setEnabledCipherSuites(sslEngine.getSupportedCipherSuites());
sslEngine.setEnableSessionCreation(true);
ch.pipeline().addFirst("SSL", new SslHandler(sslEngine));
}
감사합니다, 여러분.
Steffen의 대답 외에도 대부분의 SSL/TLS 클라이언트 (모든 웹 브라우저 포함)에는 Verisign GoDaddy 등 기본적으로 신뢰하는 사전 검사 된 CA 집합이 있습니다. CA는 클라이언트에 대한 조치 또는 변경이 필요하지 않습니다. 대부분의 '실제'CA는 돈을 청구합니다. 쇼핑을 통해 연간 몇 달러만으로 기본적인 인증서를 찾을 수 있습니다. LetsEncrypt는 아무 것도 청구하지 않고 이제는 광범위하게 신뢰할 수 있지만 8u101까지는 기본적으로 Java에서는 신뢰할 수 없습니다. –