在android中创建https连接

时间:2013-08-22 11:40:51

标签: android https

通过浏览stackoverflow和antonie,vipul等博客上的各种论坛进行大量研究后,我仍然无法解决此错误" 没有对等证书"。

我使用的代码与此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);
        }
    }
}

1 个答案:

答案 0 :(得分:-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;
    }