2011-08-12 10 views
3

私のコンピュータにlocalyをApache 2サーバーとしてインストールしました。まず、一方向SSLで設定し、Androidから接続しようとしました。私の独自の一方向SSL Apache 2サーバーを設定するためには、サーバー証明書を作成する必要がありました。私は、次のcommmandsでそれをやった:Androidでの双方向SSL:クライアント認証が動作しない

opensslのgenrsa -out server.keyの2048

のopenssl reqを-config ./openssl.cnf -new -key server.keyの-out server.req

のOpenSSL X509 -req -in server.req -CA ca.cer -CAkey ca.key -set_serial 100 -extfile openssl.cnfを-extensionsサーバ-days 365 -outform PEM アウトserver.cer

その後、server.cerファイルを取り出しましたjava keytoolを使用してBKSに変換します。 Androidからの認証が成功しました。 その後、私はApache 2サーバ の双方向SSL設定を続け、Androidとのコミュニケーションを図りました。

のopenssl reqを-config ./openssl.cnf -newkey RSA:私はクライアント証明書を作成するには、以下のコマンドを使用 ...それを動作させるために管理していなかった2048 -nodes -keyform PEM を - KEYOUT ca.key -x509 -days 3650 -extensions certauthは-outform PEM -out ca.cer

opensslのgenrsa -out client.key 2048

のopenssl reqを-config ./openssl.cnf -new -key client.key-out client.req

ope NSSL X509 -req -in client.req -CA ca.cer -CAkey ca.key -set_serial 101 -extfile openssl.cnfを-extensionsクライアント-days 365 -outform PEM -out client.cer

のopenssl PKCS12 - 輸出-inkey client.key -in client.cer -out client.p12

それはclient.p12ファイルをインポートした後、PCのブラウザから動作します。 Androidの場合、(Portecleツールを使用して)client.p12ファイルをBKS形式に変換しましたが、動作していないようです。変換が正しく行われていない可能性があります。私はいつもjavax.net.ssl.SSLPeerUnverifiedExceptionを取得します:ピア証明書例外はありません。誰にも何が問題なのか考えている人はいますか? ここでは、Androidのコードです:

public class SslTestActivity extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    try { 
     // load truststore certificate 
     InputStream clientTruststoreIs = getResources().openRawResource(
       R.raw.server); 
     KeyStore trustStore = KeyStore.getInstance("BKS"); 
     trustStore.load(clientTruststoreIs, "mypassword".toCharArray()); 

     System.out.println("---- Loaded server certificates: " 
       + trustStore.size()); 



     // load client certificate 
     InputStream keyStoreStream = getResources().openRawResource(
       R.raw.clientt); 
     KeyStore keyStore = KeyStore.getInstance("BKS"); 
     keyStore.load(keyStoreStream, "password".toCharArray()); 
     System.out 
       .println("-------Loaded client certificates: " + keyStore.size()); 


     // initialize SSLSocketFactory to use the certificate 
     SSLSocketFactory socketFactory = new SSLSocketFactory(SSLSocketFactory.TLS, 
       keyStore, "password", trustStore, null, null); 

     // Set basic data 
     HttpParams params = new BasicHttpParams(); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     HttpProtocolParams.setContentCharset(params, "UTF-8"); 


     // Register http/s shemas! 
     SchemeRegistry schReg = new SchemeRegistry(); 
     schReg.register(new Scheme("http", PlainSocketFactory 
       .getSocketFactory(), 80)); 
     schReg.register(new Scheme("https", socketFactory, 443)); 
     ClientConnectionManager conMgr = new ThreadSafeClientConnManager(
       params, schReg); 
     DefaultHttpClient sClient = new DefaultHttpClient(conMgr, params); 
     try { 
      String res = executeHttpGet(sClient, "https://10.41.0.102/"); 
      System.out.println("------- SSL RESULT IS = " + res); 
     } catch (Exception e) { 
      System.out.println("---- ex " + e.getMessage()); 
      e.printStackTrace(); 
     } 



    } catch (Exception e) { 
     System.out.println("------Exception " + e.getMessage()); 
     e.printStackTrace(); 
    } 
} 

public String executeHttpGet(DefaultHttpClient client, String url) throws Exception { 
    BufferedReader in = null; 
    try { 

     HttpGet request = new HttpGet(); 
     request.setURI(new URI(url)); 
     HttpResponse response = client.execute(request); 

     in = new BufferedReader(new InputStreamReader(response 
       .getEntity().getContent())); 
     StringBuffer sb = new StringBuffer(""); 
     String line = ""; 
     String NL = System.getProperty("line.separator"); 
     while ((line = in.readLine()) != null) { 
      sb.append(line + NL); 
     } 
     in.close(); 
     String result = sb.toString(); 
     return result; 
    } finally { 
     if (in != null) { 
      try { 
       in.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
}} 

答えて

2

あなたのコードが正しいようだありがとう。ここではあなたが試すことができますがいくつかあります:

  1. リストは、Androidからキーストアの内容は右の証明書があると構文解析可能であることを確認します。

  2. サーバ側のSSLのデバッグをオンにし、エラー/警告があるかどうかを確認するためにログに

  3. チェックlogcatを確認してください。
関連する問題