2012-07-09 10 views
6

私はSSLクライアント/サーバシステム(HTTPなし)を設定するのに十分なものを読んだ。Netty SSL:TrustManagerを書く方法

私はthe secure chat examplethe websocket ssl server exampleから自分自身のインスピレーションを受けました。

public class SecureChatTrustManagerFactory extends TrustManagerFactorySpi { 

    private static final TrustManager DUMMY_TRUST_MANAGER = new X509TrustManager() { 
     @Override 
     public X509Certificate[] getAcceptedIssuers() { 
      return new X509Certificate[0]; 
     } 

     @Override 
     public void checkClientTrusted(
       X509Certificate[] chain, String authType) throws CertificateException { 
      // Always trust - it is an example. 
      // You should do something in the real world. 
      // You will reach here only if you enabled client certificate auth, 
      // as described in SecureChatSslContextFactory. 
      System.err.println(
        "UNKNOWN CLIENT CERTIFICATE: " + chain[0].getSubjectDN()); 
     } 

     @Override 
     public void checkServerTrusted(
       X509Certificate[] chain, String authType) throws CertificateException { 
      // Always trust - it is an example. 
      // You should do something in the real world. 
      System.err.println(
        "UNKNOWN SERVER CERTIFICATE: " + chain[0].getSubjectDN()); 
     } 
    }; 

    public static TrustManager[] getTrustManagers() { 
     return new TrustManager[] { DUMMY_TRUST_MANAGER }; 
    } 

    @Override 
    protected TrustManager[] engineGetTrustManagers() { 
     return getTrustManagers(); 
    } 

    @Override 
    protected void engineInit(KeyStore keystore) throws KeyStoreException { 
     // Unused 
    } 

    @Override 
    protected void engineInit(ManagerFactoryParameters managerFactoryParameters) 
      throws InvalidAlgorithmParameterException { 
     // Unused 
    } 
} 

がどのように適切にこのクラスを実装します: はすでに私のcert.jksは、このクラスがあり、安全なチャットの例では、コマンド

keytool -genkey -alias app-keysize 2048 -validity 36500 
-keyalg RSA -dname "CN=app" 
-keypass mysecret-storepass mysecret 
-keystore cert.jks 

でファイルを作成しましたか?

そして(SecureChatSslContextFactoryクラスで)このコードで:

SSLContext serverContext = null; 
    SSLContext clientContext = null; 
    try { 
     KeyStore ks = KeyStore.getInstance("JKS"); 
     ks.load(SecureChatKeyStore.asInputStream(), 
       SecureChatKeyStore.getKeyStorePassword()); 

     // Set up key manager factory to use our key store 
     KeyManagerFactory kmf = KeyManagerFactory.getInstance(algorithm); 
     kmf.init(ks, SecureChatKeyStore.getCertificatePassword()); 

     // Initialize the SSLContext to work with our key managers. 
     serverContext = SSLContext.getInstance(PROTOCOL); 
     serverContext.init(kmf.getKeyManagers(), null, null); 
    } catch (Exception e) { 
     throw new Error(
       "Failed to initialize the server-side SSLContext", e); 
    } 

    try { 
     clientContext = SSLContext.getInstance(PROTOCOL); 
     clientContext.init(null, SecureChatTrustManagerFactory.getTrustManagers(), null); 
    } catch (Exception e) { 
     throw new Error(
       "Failed to initialize the client-side SSLContext", e); 
    } 

は、なぜ彼らはラインserverContext.init(kmf.getKeyManagers(), null, null);null代わりのtmf.getTrustManagers()を置けばいいの?

答えて

9

どのようにこのクラスを適切に実装しますか?

証明書を信頼するかどうかを確認する方法を定義する必要があります。chain[0]です。あなたがしない場合は、CertificateExceptionを投げる。 (ここでSecureChatTrustManagerFactoryは何かを投げたことがないので、MITM攻撃へのオープン接続を行うことができます検証を、バイパスされます。)

あなたは半手動でこの検証を行いたい場合は、あなたが、Java PKI APIを使用することができさえit can be a bit tedious、ものの比較的単純なユースケースでは

一般的に言えば、適切なことはではなく、です。 TrustManagerFactoryにしておきます(KeyManagerFactoryと同じように多かれ少なかれ)。ちなみに、どちらの場合でも、私はalgorithmの値にKey/TrustManagerFactory.getDefaultAlgorithm()を使用することをお勧めします。多くの場合ハードコードされている(実際にはデフォルトのTMFアルゴリズムの値ではない)のは、少なくともSunX509よりも良いデフォルト値です。

独自のトラストストア(たとえば、この接続用にロードできるKeyStoreのインスタンス)からTMFを初期化できます。彼らは代わりにライン serverContext.init(kmf.getKeyManagers()は、null、null)の中tmf.getTrustManagers()でnullを入れてやるのはなぜ

。 ?バックデフォルト値にSecureRandom秋のための

信託管理者のためのnullnull。これはデフォルトのトラストストア(javax.net.ssl.trustStoreの場所を使用するか、またはjssecacertsファイルまたはcacertsにフォールバックする)を使用して、デフォルトのTMFアルゴリズム(通常はPKIX)で初期化されるデフォルトのトラストマネージャになります。 JSSE reference guideの詳細。

+1

まだ何かを動作させることができませんでした... 自分のTrustManagerFactoryを実装する方法がわかりません – Nanocom

+1

独自のTMFを実装しないで、既存のものを使用してください。 – Bruno

+0

申し訳ありませんが、私は自分自身のSecureChatSslContextFactory – Nanocom

関連する問題