2011-11-09 12 views
1

HttpsUrlConnection classを使用してAndroidでSSLの検証について質問があります。私は安全な接続を使用してWebサーバーに接続し、sslを検証する必要があります。有効期限が切れているかどうか、また証明書の名前がカスタム証明書の名前と一致するかどうかを確認する必要があります。オプションで、SSL証明書のサムネイルを検証することもできます(事前定義されているものまで)。ここで私は、サーバーに接続するために、今の使っているコードは次のとおりです。Android HttpsUrlConnection SSLの有効性を確認

public void UseHttpsConnection(String url, String charset, String query) { 

    try { 
     final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { 
      @Override 
      public void checkClientTrusted(final X509Certificate[] chain, final String authType) { 
      } 
      @Override 
      public void checkServerTrusted(final X509Certificate[] chain, final String authType) { 
      } 
      @Override 
      public X509Certificate[] getAcceptedIssuers() { 
       return null; 
      } 
     } }; 

     // Install the all-trusting trust manager 
     final SSLContext sslContext = SSLContext.getInstance("TLS"); 
     sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); 
     // Create an ssl socket factory with our all-trusting manager 
     final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); 



     System.setProperty("http.keepAlive", "false"); 
     HttpsURLConnection connection = (HttpsURLConnection) new URL(url) 
       .openConnection(); 
     connection.setSSLSocketFactory(sslSocketFactory); 
     connection.setDoOutput(true); 
     connection.setRequestMethod("POST"); 
     connection.setRequestProperty("Charset", charset); 
     connection.setRequestProperty("Content-Type", 
       "application/x-www-form-urlencoded;charset=" + charset); 
     OutputStream output = null; 
     try { 
      output = connection.getOutputStream(); 
      output.write(query.getBytes(charset)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (output != null) 
       try { 
        output.close(); 
       } catch (IOException logOrIgnore) { 
        logOrIgnore.printStackTrace(); 
       } 
     } 

     int status = ((HttpsURLConnection) connection).getResponseCode(); 
     Log.i("", "Status : " + status); 

     for (Entry<String, List<String>> header : connection 
       .getHeaderFields().entrySet()) { 
      Log.i("Headers", 
        "Headers : " + header.getKey() + "=" 
          + header.getValue()); 
     } 

     InputStream response = new BufferedInputStream(
       connection.getInputStream()); 

     int bytesRead = -1; 
     byte[] buffer = new byte[30 * 1024]; 
     while ((bytesRead = response.read(buffer)) > 0) { 
      byte[] buffer2 = new byte[bytesRead]; 
      System.arraycopy(buffer, 0, buffer2, 0, bytesRead); 
      handleDataFromSync(buffer2); 
     } 

     connection.disconnect(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

私はSSLの検証と新たなんだとそれを行うための基本的な事柄ので、私は、ここで少し助けを必要としています。どんな助けでもありがとう!

答えて

2

証明書を検証する場合は、最初に行う必要があることは、何も信頼しない安全でないTrustManagerを破棄することです。代わりに、のようにあなたが必要とする方法で証明書を受け取っているかどうかを確認してください。

+0

実際に私はこれまでSSLで作業していませんし、そのことがどのように機能するかを理解するのは少し難しいです。 –

関連する問題