2017-01-04 8 views
0

私は、サーバがj2seアプリケーションでクライアントがアンドロイドアプリケーションであるサーバ - クライアントモデルで非常に小規模なアプリケーションを作っています。android-j2seでサーバクライアントソケット通信でSSLを使用する

サーバーは動的DNSでホストされ、ドメイン名の変更と同様に移植可能である必要があります。

SSLを使用すると、証明書には識別可能なサーバーアドレス(ドメイン名またはIP)が必要なので、問題が発生する可能性があります。私は、別の場所から同じ公開鍵を送信するサーバとして、誰かが偽装するのを防ぐことを前提としています。

この状況にどのように対処すればよいですか?

答えて

0

以下は、進むべきヒントです。サーバの証明書を検証するコネクション用のカスタムトラストマネージャを追加し、受け入れ可能なリストからホスト名を評価するカスタムホスト名検証ロジックを追加するか、ハードコードのみをtrueに設定します。 docsから

 SSLContext ctx = SSLContext.getInstance("TLS"); 
     TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
     tmf.init(getTrustedCert());//todo 
     ctx.init(null, tmf.getTrustManagers(), null); 

     HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory()); 

     HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 
      @Override 
      public boolean verify(String arg0, SSLSession arg1) { 
       return isInAcceptableHostNameList(arg0);//todo 
      } 
     }); 

-

このクラスは、のHostnameVerifierとのSSLSocketFactoryを使用しています。両方のクラスに対して定義されているデフォルト実装は です。ただし、 の実装は、クラスごと(静的)または インスタンスごとに置き換えることができます。新しいHttpsURLConnectionsインスタンスはすべて、インスタンス作成時に "デフォルト"の静的値が割り当てられた になりますが、 は、接続する前に適切なインスタンス単位の設定方法( )を呼び出してオーバーライドできます。

+0

これはhttpsの方法ですが、httpの単純な要求と応答モデルではなく、双方向通信が必要であるため、普通の古いソケットを使用します – Allahjane

関連する問題