2012-09-23 13 views
5

私は、組み込みのクラスcom.sun.net.httpserver.HttpsServerを使用してJava(6)でカスタムHTTPSサーバーを構築しようとしています。クライアント認証が必要になるまでうまく動作します。その時点で、サーバー上のSSLデバッグでは次の例外が発生して失敗します。Java6で制約チェック(Netscape certタイプ)を無効にする方法は?

sun.security.validator.ValidatorException:ネットスケープ証明書の種類は、私たちの内部のすべてのアプリケーションに使用される当社の内部CAによって発行された証明書を使用していますSSLクライアント

のための使用を許可していません。私は証明書の詳細をチェックし、そのタイプが "SSLサーバー"であることを発見しました(詳細は下記参照)。私たちの方針はすべての内部アプリケーションに「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); 

キーマネージャをサーバーキーストア(通常どおり)から初期化する必要があります。 HttpsServerHttpsConfiguratorを使用してSSLContextを設定することができます(このドキュメントの例を参照)。

この手法は理想的ではありません。

  • まず、ValidatorExceptionは、公開APIの一部ではありませんsun.*パッケージにあります。このコードでは、Oracle/OpenJDKのJREのために具体的になります。
  • 第2に、エンドエンティティがチェックされ(鍵使用の拡張子を確認する)happens after the rest of the trust validation(このような他のより基本的なチェックを無視しないので、その例外を無視することができます)。

もちろん、Java証明書パスAPIを使用して独自の検証を再実装し、この目的のためのキー使用のみを無視することもできます。これにはもう少しコードが必要です。

さらに、クライアント証明書としてSSL/TLS用の証明書を使用する場合は、正しい拡張子がない場合でも、仕様をバイパスしようとしています。 CAポリシーを修正することが最善の方法ですが、それは内部CAであれば実現可能です。サーバー証明書では、大きなCAであっても、TLSクライアントの拡張キー使用が設定されていることがよくあります。

+0

ありがとうございました。それはとてもうまくいった。理想的な解決策はCAポリシーを更新することですが、私がバイパスソリューションを構築しないと、何百ものシステムで私のソフトウェアをアップグレードするには、即座に証明書を更新する必要があります。 – Arun

+2

これは永遠に永遠に続く汚れた修正のように聞こえる。 – sjas

+0

@sjasはい、私はこれを読んだ人でもテキストを読んで、単にコピーアンドペーストしないことを願っています。 – Bruno

関連する問題