2017-10-05 8 views
0


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)); 
} 

감사합니다, 여러분.

+0

Steffen의 대답 외에도 대부분의 SSL/TLS 클라이언트 (모든 웹 브라우저 포함)에는 Verisign GoDaddy 등 기본적으로 신뢰하는 사전 검사 된 CA 집합이 있습니다. CA는 클라이언트에 대한 조치 또는 변경이 필요하지 않습니다. 대부분의 '실제'CA는 돈을 청구합니다. 쇼핑을 통해 연간 몇 달러만으로 기본적인 인증서를 찾을 수 있습니다. LetsEncrypt는 아무 것도 청구하지 않고 이제는 광범위하게 신뢰할 수 있지만 8u101까지는 기본적으로 Java에서는 신뢰할 수 없습니다. –

답변

2

단방향 인증이란 서버에서만 인증서를 보유한다는 의미입니다.

서버가 인증서를 사용하여 자체 인증해야합니다. 이것을 위해서는 인증서와 일치하는 개인 키가 필요합니다.
클라이언트는 인증을 확인해야합니다. 즉, 서버에서 보내는 인증서가 실제로 예상 된 인증서인지 확인해야합니다. 이를 위해서는 인증서 자체 또는 인증서를 발행 한 CA (자체 서명 인증서의 경우 동일)를 알아야합니다.

클라이언트는 서버 인증서 나 발급자 CA에 대한 이전 지식이 필요하지 않습니다. 이 경우 클라이언트는 모든 인증서를 수락하며 서버의 인증서를 수정하고 공격자의 인증서도 위조합니다. 이전의 지식 (즉, 로컬 신뢰 앵커)이 없다면, 서버는 올바른 인증서와 위조 된 인증서를 구별 할 수 없다.