2014-05-11 4 views
3

상호 식별 (ClientAuth)이 가능한 SSL 소켓 서버 및 클라이언트 프로그램을 사용하고 있습니다. 클라이언트는 자체 인증서를 사용하는 두 가지 유형으로 구성됩니다. 어떻게 서버가 새로 연결된 clent의 유형을 결정할 수 있습니까? 클라이언트의 인증서 별칭 또는 다른 식별 가능한 속성? 핸드 쉐이크가 완료Java SSL 클라이언트 ID

SSLContext ctx = SSLContext.getInstance("TLSv1.2"); 
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
KeyStore ks = KeyStore.getInstance("JKS"); 

ks.load(new FileInputStream(serverKeystoreFile), serverKeystorePass); 
kmf.init(ks, serverCertificatePass); 
ks.load(new FileInputStream(serverTruststoreFile), serverTruststorePass); 
tmf.init(ks); 
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); 
SSLServerSocketFactory ssf = ctx.getServerSocketFactory(); 
SSLServerSocket sslserversocket = (SSLServerSocket) ssf.createServerSocket(port); 
sslserversocket.setNeedClientAuth(true); 

// accept connection from client 
SSLSocket sslsocket = (SSLSocket) sslserversocket.accept(); 

// At this point, I would like to determine the connected client's certificate alias 
// or some other property that is unique for each of the acceptable client certificates. 
+0

"... 또는 다른 구별 할 수있는 속성"- 아래의 워렌 (Walren)의 답변 외에 'getCipher'를 호출하여 암호 모음을 검색 할 수도 있습니다. 'getCipher'는'SSLContext'와'HttpsUrlConnection'과 같이 사용할 수 있습니다. 나는 당신이 필요로하는 것처럼 구별되는 것은 확실하지 않지만, 특별한 연결의 속성은 분명합니다. 추가 세션 관련 정보를 제공해야하는'getSessionContext'도 있습니다. – jww

+0

키 스토어를로드 할 때 입력 스트림을 닫는 것을 잊지 마십시오. – Bruno

답변

3

후에는 클라이언트의 인증서를 얻기 위해 서버에 SSLSocket.getSession().getPeerCertificate()를 호출 할 수 있어야한다 :

여기에 연결 양식 클라이언트를 서버를 설정하고 받아 내 코드입니다.

+1

팁 주셔서 감사합니다.이 것은 저에게 유용했습니다 :'SSLSocket.getSession(). getPeerPrincipal(). getName()' – Baltazar