2011-02-06 4 views
2

서버 인증서를 보내려면 보안 서버 소켓의 경우 을 KeyManagerFactory.getKeyManagers()으로 초기화하고 키 스토어로 초기화해야합니다.
하지만 어떻게 클라이언트 측에서이 작업을 수행 할 수 있습니까?
즉, 클라이언트의 경우 :java 보안 클라이언트 소켓 인증

System.setProperty("javax.net.ssl.keyStore", "clientKeystore.keystore"); 
System.setProperty("javax.net.ssl.keyStorePassword", "secret"); 
System.setProperty("javax.net.ssl.trustStore", "clientKeystore.keystore"); 
System.setProperty("javax.net.ssl.trustStorePassword", "secret"); 
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
SSLSocket socket = (SSLSocket) factory.createSocket("localhost", 7890); 

신뢰 저장소와 동일한 키 저장소를 사용합니다. 나는 JSSE를 arround로보기 만해도 괜찮다고 생각한다.
문제는 서버 부분에 있습니다 (서버 소켓에 setNeedClientAuth이 있음).

Exception in thread "main" javax.net.ssl.SSLHandshakeException: null cert chain 

그래서 인증서를 보내도록 클라이언트 측을 구성해야합니까? 시스템 속성이 올바른 방법이 아닌가요?
SSLContext를 클라이언트 측에서 사용하는 방법을 알지 못하기 때문에.

감사합니다.

+0

클라이언트 또는 서버 코드에 오류가 있습니까? –

+0

@GregS : 이것은 서버 코드의 예외입니다. 클라이언트 코드에서 예외가 발생했습니다. 메인 "java.net.SocketException : 소프트웨어가 연결을 중단했습니다 : recv failed가 발생했습니다." – Cratylus

답변

0

인증에 인증서를 사용하려면 클라이언트 측에서 특정 구성을 설정할 필요가 없습니다. 일부 중간 CA가 키 스토어에 누락되어 클라이언트가 서버가 보낸 트러스트 앵커에서 인증서 경로를 작성할 수 없으므로 인증서가 인증에 적합한 지 확인할 수 없습니다.

javax.net.debugall에 추가하여 디버그 스트림을 표준 출력에 인쇄 할 수 있습니다. 어쩌면 오류에 대한 자세한 정보를 얻을 수 있습니다.

+0

오해 일 수도 있습니다. 클라이언트 jvm에 시스템 프로퍼티로서 keystore, trustore가 서버가 사용하고있는 것과 같은 키 스토어를 가리키고있다.이 키 스토어/트러스트 스토어에는 내가 생성 한 (자기 서명 된) 인증서가 하나만 들어있다. 나는 서버와 클라이언트가 둘 다 교환한다고 가정한다. 같은 증서. 문제가 생길거야? – Cratylus

+0

@user384706 클라이언트의 트러스트 스토어는 서버의 키 저장소를 신뢰해야합니다. 클라이언트 인증을 사용하는 경우 반대의 경우도 마찬가지입니다. 서버와 클라이언트 모두에서 동일한 파일을 사용한다고해서 보안 관점에서 볼 때 어떤 관점에서도 * 특히 * 어떤 점에서도 의미가 없습니다. 서버의 키 저장소에는 서버의 개인 키가 들어 있으며 유니버스의 다른 곳에서는 나타나지 않아야합니다. ** 그렇지 않으면 핸드 셰이크에 의해 설정된 서버의 ID를 신뢰할 수 없습니다. – EJP