2016-07-11 2 views
1

현재 SSL을 사용하여 네트워크 TCP 서버를 작성 중입니다. 프로덕션 환경에서는 마침내 클라이언트가 인증서로 인증하도록 요구할 것입니다.Java SSL 인증서 해지 확인

긴급한 경우 인증서를 해지하기 위해 CRL을 설정하고 싶습니다.

내 질문은 : Java가 CRL을 (인증서와 함께 제공되는 경우) 즉시 확인하거나 수동으로 구현해야합니까?

테스트를 위해 CRL이 설정된 인증서를 준비했지만 Java가 유효성을 검사하지 않는 것 같습니다 (로컬 웹 서버에 놓았고 액세스 할 수 없음).

나는 단지 com.sun.net.ssl.checkRevocation = true VM 옵션을 찾았지만 분명히 CRL을 쿼리하지 않습니다. VM 디버깅 설정 이 java.security.debug = CertPath를

자바는 서브 시스템에서 클래스와 관련된 것 같습니다 ... 중, 출력을 생성하지 않습니다 (예 : java.security.cert.X509CRLSelector)하지만, 그것은 분명히 작용하지 않습니다. https://www.dropbox.com/s/3fqmd1v9mn2a5ve/ssltest.zip?dl=0

+0

기본적으로 java에서는 CRL을 확인하지 않으므로 필요한 경우 사용자 정의 인증서 유효성 검사기를 만들어야합니다. –

+0

https://www.java.com/en/download/help/revocation_options.xml –

+0

[CRL Verification in Java]의 중복 가능성이 있습니다 (http://stackoverflow.com/questions/30903993/crl-verification). -in-java) –

답변

7

:

나는 키/truststores 및 ZIP 압축 파일로 다운로드받을 수있는 클라이언트/서버에 대한 자체 서명 인증서를 기반으로하는 SSLContext를 초기화 클라이언트 서버로 아파치 미나를 사용하여 작은 받는다는 스타일의 프로젝트를 썼다 주석에서 제안 된대로 사용자 정의 유효성 검사기를 구현하지 않고 SSLContext 내에서 CRL 검사를 활성화하는 방법을 생각했습니다.

주로 SSLContext의 TrustManagers를 해지 검사기로 제대로 초기화하는 데 불과하며 몇 줄 밖에없고 사용자 정의 검사 논리가없고 CRL도 확인 경로와 함께 자동으로 검사됩니다. 여기

은 ... 코드 조각의 본질적으로 내가 클라이언트에 발급 한 인증서는 우리의 CRL에 취소 여부를 확인, 내 응용 프로그램에 필요한 어떤 한
KeyStore ts = KeyStore.getInstance("JKS"); 
FileInputStream tfis = new FileInputStream(trustStorePath); 
ts.load(tfis, trustStorePass.toCharArray()); 

KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 

// initialize certification path checking for the offered certificates and revocation checks against CLRs 
CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX"); 
PKIXRevocationChecker rc = (PKIXRevocationChecker)cpb.getRevocationChecker(); 
rc.setOptions(EnumSet.of(
    PKIXRevocationChecker.Option.PREFER_CRLS, // prefer CLR over OCSP 
    PKIXRevocationChecker.Option.ONLY_END_ENTITY, 
    PKIXRevocationChecker.Option.SOFT_FAIL, // handshake should not fail when CRL is not available 
PKIXRevocationChecker.Option.NO_FALLBACK)); // don't fall back to OCSP checking 

PKIXBuilderParameters pkixParams = new PKIXBuilderParameters(ts, new X509CertSelector()); 
pkixParams.addCertPathChecker(rc); 

tmf.init(new CertPathTrustManagerParameters(pkixParams)); 
// init KeyManagerFactory 
kmf.init(...) 

SSLContext ctx = SSLContext.getInstance("TLS"); 
ctx.init(kmf.getKeyManagers), tmf.getTrustManagers(), null); 

. 엔드 엔티티 만 확인하고 CRL 확인이 실패하도록 허용하는 것은 우리의 모든 인프라 때문입니다.

+0

이봐, 자바 1.7과 비슷한 솔루션이 있는가? – mdavid

+0

@ mdavid : 죄송합니다. 저는 그 답변을 몇 번이나 주셨습니다.하지만 Java 8 (출시 3 년 후)을 사용해보십시오. 보안 스택에 많은 개선이있었습니다. http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html 변경 로그에 _PKIXRevocationChecker _가 언급되어 있기 때문에 1.7에서 인증서를 확인하기위한 즉시 사용 가능한 솔루션이 없다고 가정합니다. – DoNuT

+0

안녕하세요 @ DoNuT, 원격 위치 (CERT에서 제공)에서 CRL을 가져 와서 다음 업데이트 시간까지 캐싱을 처리합니까? 그런 다음 새 CRL을 다시 가져 오는 중입니까? 미리 감사드립니다. – ramtech