2011-11-09 76 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和我有點難以理解事情的工作原理。 –