2013-08-22 77 views
0

經過在stackoverflow和博客如antonie,vipul上的各種論壇大量的研究,我仍然unbale仍然解決這個錯誤「沒有同行證書」。在android中創建https連接

我使用的代碼是完全一樣給予這個blog entry

但儘管如此,我得到一個例外。我也創建了.bks文件並在代碼中使用它。請不要將其標記爲重複,不回答我如何信任所有證書,因爲我已經研究了

我已經使用這個代碼:

public class MyHttpClient extends DefaultHttpClient { 

    final Context context; 

    public MyHttpClient(Context context) { 
     this.context = context; 
    } 

    @Override 
    protected ClientConnectionManager createClientConnectionManager() { 
     SchemeRegistry registry = new SchemeRegistry(); 
     registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
     // Register for port 443 our SSLSocketFactory with our keystore 
     // to the ConnectionManager 
     registry.register(new Scheme("https", newSslSocketFactory(), 443)); 
     return new SingleClientConnManager(getParams(), registry); 
    } 

    private SSLSocketFactory newSslSocketFactory() { 
     try { 
      // Get an instance of the Bouncy Castle KeyStore format 
      KeyStore trusted = KeyStore.getInstance("BKS"); 
      // Get the raw resource, which contains the keystore with 
      // your trusted certificates (root and any intermediate certs) 
      InputStream in = context.getResources().openRawResource(R.raw.cacer); 
      // FileInputStream in = new FileInputStream(new File("key.bks")); 

      try { 

       trusted.load(in, "govill".toCharArray()); 
       // Initialize the keystore with the provided trusted certificates 
       // Also provide the password of the keystore 
      } finally { 
       in.close(); 
      } 
      // Pass the keystore to the SSLSocketFactory. The factory is responsible 
      // for the verification of the server certificate. 
      SSLSocketFactory sf = new SSLSocketFactory(trusted); 
      // Hostname verification from certificate 
      // http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e506 
      sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER); 
      return sf; 
     } catch (Exception e) { 
      System.out.print(e); 
      throw new AssertionError(e); 
     } 
    } 
} 
+0

是服務器您想要爲SSL配置的連接?他有沒有有效的證書?另外,也許最重要的是,您是否使用自簽名證書,並且您希望服務器向用戶進行身份驗證,反之亦然,還是僅僅是第一種情況? – Eric

回答

-1
public String SendHttpPost(String URL, JSONObject jsonObjSend) throws ClientProtocolException, IOException { 


      DefaultHttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httpPostRequest = new HttpPost(URL); 


      // Set HTTP parameters 
      /*StringEntity se; 
      se = new StringEntity(jsonObjSend.toString());*/ 
      jsonObjSend.length(); 

      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(jsonObjSend.length()); 
      nameValuePairs.add(new BasicNameValuePair("data", jsonObjSend.toString())); 
      // Log.i("jsonObjSend.toString()","jsonObjSend.toString()"+jsonObjSend.toString()); 

      Log.i("HTTPPOST","URL: "+URL); 
      Log.i("HTTPPOST","Request: "+jsonObjSend.toString()); 
      UrlEncodedFormEntity en=new UrlEncodedFormEntity(nameValuePairs); 
      en.getContent(); 
      httpPostRequest.getParams().setParameter("http.socket.timeout", new Integer(600000)); 
      httpPostRequest.setEntity(en); 
      long t = System.currentTimeMillis(); 
      HttpResponse response = (HttpResponse) httpclient.execute(httpPostRequest); 
      Log.i(TAG, "HTTPResponse received in [" + (System.currentTimeMillis()-t) + "ms]"); 
      Log.i(TAG, httpPostRequest.getRequestLine().getProtocolVersion().toString()); 
      responses = convertEntityToString(response.getEntity(), "UTF-8"); 
      Log.i("HTTPPOST","Responce: "+responses); 
      Log.i("HTTPPOST","******************"); 
      //Log.i("Encoding",response.getEntity().getContentEncoding().getName()); 

     return responses; 
    } 
+0

這個答案與OP的問題有什麼關係? -1 – t0mm13b

+0

eric-tobias,我使用此代碼來調用「https://demo.yoursuppliernetwork.com」是的,我希望該服務器應該通過用戶名和密碼對用戶進行身份驗證 – prateekgovill