2012-09-23 2 views
5

com.sun.net.httpserver.HttpsServer 클래스를 사용하여 Java (6)에서 사용자 정의 HTTPS 서버를 빌드하려고합니다. 그것은 클라이언트 인증을 요구할 때까지 잘 작동합니다. 이 시점에서 서버의 SSL 디버그에서 다음 예외가 발생하면 실패합니다.Java6에서 제약 조건 검사 (Netscape cert 유형)를 비활성화하는 방법은 무엇입니까?

sun.security.validator.ValidatorException : 넷스케이프 인증서 유형 I은 우리 내부의 모든 응용 프로그램에 사용되는 내부 CA에서 발급 한 인증서를 사용하고 SSL 클라이언트

에 대한 사용을 허용하지 않습니다. 인증서 세부 정보를 검사하고 그 유형이 "SSL 서버"(아래에 인용 된 세부 정보) 인 것을 발견했습니다. Google의 정책은 모든 내부 애플리케이션에 'SSL 서버'유형을 사용하기 때문에 인증서를 변경하기가 어렵습니다. 클라이언트 용 서버 인증서를 사용하고 싶기 때문에 이것이 보안 문제라고 생각하지 않습니다.

내가 찾고있는 것은 Java에서이 제약 조건 검사를 비활성화하는 방법입니다. 누구든지이 문제를 겪고이 문제를 해결 했습니까? 어떤 도움을 주셔서 감사합니다.

최고 감사합니다, 아룬

Owner: CN=myapp, OU=mygroup, O=mycompany 

Issuer: O=MYCA 

Serial number: 4cc8c1da 

Valid from: Mon Jan 10 13:46:34 EST 2011 until: Thu Jan 10 14:16:34 EST 2013 

Certificate fingerprints: 
     MD5: 8C:84:7F:7A:40:23:F1:B5:81:CD:F9:0C:27:16:69:5E 
     SHA1: 9B:39:0B:2F:61:83:52:93:D5:58:E5:43:13:7A:8F:E1:FD:AC:98:A4 
     Signature algorithm name: SHA1withRSA 
     Version: 3 

Extensions: 

[1]: ObjectId: 2.5.29.16 Criticality=false 
PrivateKeyUsage: [ 
From: Mon Jan 10 13:46:34 EST 2011, To: Wed Jul 11 21:16:34 EDT 2012] 

[2]: ObjectId: 2.5.29.15 Criticality=false 
KeyUsage [ 
    DigitalSignature 
    Key_Encipherment 
] 

[3]: ObjectId: 2.5.29.14 Criticality=false 
SubjectKeyIdentifier [ 
KeyIdentifier [ 
0000: D3 47 35 9B B4 B7 03 18 C6 53 2C B0 FE FD 49 D8 .G5......S,...I. 
0010: D0 FB EE 15          .... 
] 
] 

[4]: ObjectId: 1.2.840.113533.7.65.0 Criticality=false 

[5]: ObjectId: 2.5.29.31 Criticality=false 
CRLDistributionPoints [ 
    [DistributionPoint: 
    [CN=CRL413, O=SWIFT] 
]] 

[6]: ObjectId: 2.5.29.19 Criticality=false 
BasicConstraints:[ 
    CA:false 
    PathLen: undefined 
] 

****[7]: ObjectId: 2.16.840.1.113730.1.1 Criticality=false 
NetscapeCertType [ 
    SSL server 
]**** 

[8]: ObjectId: 2.5.29.35 Criticality=false 
AuthorityKeyIdentifier [ 
KeyIdentifier [ 
0000: 8F AF 56 BC 80 77 A3 FD 9E D2 89 83 98 FE 98 C7 ..V..w.......... 
0010: 20 65 23 CC           e#. 
] 

] 

답변

1

당신은 기본 신뢰 관리자를 포장하고,이 예외를 잡을 수 있습니다.

class IgnoreClientUsageTrustManager extends X509TrustManager { 
    private final X509TrustManager origTrustManager; 
    public class IgnoreClientUsageTrustManager(X509TrustManager origTrustManager) { 
     this.origTrustManager = origTrustManager; 
    } 

    public checkClientTrusted(X509Certificate[] chain, String authType 
     throws IllegalArgumentException, CertificateException { 
     try { 
      this.origTrustManager.checkClientTrusted(chain, authType); 
     } catch (ValidatorException e) { 
      // Check it's that very exception, otherwise, re-throw. 
     } 
    } 

    // delegate the other methods to the origTrustManager 
}   

는 다음에, SSLContext을 만들 신뢰 관리자를 사용하여 서버와 함께 사용이이 라인을 따라 뭔가 될 것입니다.

TrustManagerFactory tmf = TrustManagerFactory.getInstance(
    TrustManagerFactory.getDefaultAlgorithm()); 
tmf.init((KeyStore)null); 
TrustManager[] trustManagers = tmf.getTrustManagers(); 

for (int i = 0; i < trustManagers.length; i++) { 
    if (trustManagers[i] instanceof X509TrustManager) { 
     trustManagers[i] = IgnoreClientUsageTrustManager(trustManagers[i]); 
    } 
} 

SSLContext sslContext = SSLContext.getInstance("TLS"); 
sslContext.init(... you keymanagers ..., trustManagers, null); 

(일반적으로) 서버 키 스토어에서 keymanagers를 초기화해야합니다. 그런 다음 HttpsServerHttpsConfigurator을 사용하여 SSLContext을 설정할 수 있어야합니다 (문서의 예 참조).

그러나이 기술은 이상적이지 않습니다. 이 코드는 Oracle/오픈 JDK JRE에 대한 특정 될 것입니다 :

  • 첫째, ValidatorException는 공개 API의 일부가 아니에요 sun.* 패키지입니다.
  • 두 번째로, 최종 엔티티가 (키 사용 확장을 확인하는) happens after the rest of the trust validation (다른 기본 검사를이 방식으로 무시하지 않으므로이 예외를 무시하는 것이 허용됩니다)에 의존합니다.

Java Certificate Path API를 사용하고 대신이 용도로 키 사용법 만 무시하면 사용자 고유의 유효성 검사를 다시 구현할 수 있습니다. 이렇게하려면 약간 더 많은 코드가 필요합니다.

오른쪽 확장자가없는 클라이언트 인증서로 SSL/TLS 용 인증서를 사용하려는 경우 일반적으로 사양을 무시하려고합니다. 가장 좋은 해결 방법은 CA 정책을 수정하는 것입니다. CA 정책이 내부 CA 인 경우 실행 가능해야합니다. 서버 인증서가 큰 CA를 사용하는 경우에도 TLS 클라이언트 확장 키 사용을 설정하는 것이 일반적입니다.

+0

대단히 감사합니다. 그것은 아주 잘 작동했습니다. 이상적인 솔루션은 CA 정책을 업데이트하는 것이지만, 우회 솔루션을 구축하지 않으면 백개의 시스템에서 내 소프트웨어를 업그레이드 할 때 즉각적인 인증서 갱신이 필요합니다. – Arun

+2

이것은 영원히 지속될 더러운 수정처럼 들립니다. – sjas

+0

@sjas 네, 저는이 책을 읽은 사람이 텍스트를 읽고 단순히 복사하여 붙여 넣기 만하지 않기를 바랍니다. – Bruno