繁体   English   中英

使用HTTPClient在Android中发送HTTPS发布请求以获取未验证的证书

[英]Sending HTTPS post request in android using HTTPClient for unverified certificates

我已经编写了这段代码,用于将POST请求发送到运行nodejs的本地服务器,该服务器具有使用openssl命令生成的证书。 但是,当我尝试发送发布请求时,我可以在android日志中看到trust anchorhttps上的POST请求的问题不起作用,但是如果我从nodejs服务器中删除证书并使用http发送请求,则可以正常工作。 我知道这是因为我的证书未从任何知名的CA(如verisign)进行验证。 那么,如何将请求发送到此https服务器? 我也尝试在我的android手机中安装证书,但它也没有解决我的问题。 我也可以发布HttpClient.java的源代码。

public class MainActivity extends AppCompatActivity {
    Button encAndSendBtn;
    TextView companyName, modelNumber, specification;

    public MainActivity() throws MalformedURLException {
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        encAndSendBtn = (Button) findViewById(R.id.encAndSend);
        companyName = (TextView) findViewById(R.id.company);
        modelNumber = (TextView) findViewById(R.id.modNum);
        specification = (TextView) findViewById(R.id.spec);
    }
    public void onclickbutton(View view) {

        encSend scv = new encSend();
        scv.execute();
    }

    private class encSend extends AsyncTask {

        String companyNameS = companyName.getText().toString();
        String modelNumberS = modelNumber.getText().toString();
        String specificationS = specification.getText().toString();

        @Override
        protected Object doInBackground(Object[] objects) {
           JSONObject jsonObjSend = new JSONObject();
           JSONObject encrptObjSend = new JSONObject();

           try {
                jsonObjSend.put("Company", companyNameS);
                jsonObjSend.put("Model Number", modelNumberS);
                jsonObjSend.put("Specification", specificationS);

                String finalData = jsonObjSend.toString();
                Log.i("data", finalData); 
                String key = "HelloWorld321@!";
                String encrypt;
                try {
                    CryptLib cryptLib = new CryptLib();
                    String iv = "1234123412341234";
                    encrypt = cryptLib.encryptSimple(finalData, key, iv);

                    encrptObjSend.put("encrptedtext", encrypt);
            } catch (Exception e) {
                    e.printStackTrace();
                }

                Log.i("Encrypted data", encrptObjSend.toString());

                JSONObject header = new JSONObject();
                header.put("deviceType", "Android"); // Device type
                header.put("deviceVersion", "2.0"); // Device OS version
                header.put("language", "es-es");    // Language of the Android client
                encrptObjSend.put("header", header);

            } catch (JSONException e) {
                e.printStackTrace();
            }
            JSONObject jsonObjRecv = HttpClient.SendHttpPost("https://192.168.43.59:443/api/aes", encrptObjSend);
            return "success";
        }
    }
}

更新:

public class HttpClient {
private static final String TAG = "HttpClient";

public static JSONObject SendHttpPost(String URL, JSONObject jsonObjSend) {

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

        StringEntity se;
        se = new StringEntity(jsonObjSend.toString());

        // Set HTTP parameters
        httpPostRequest.setEntity(se);
        httpPostRequest.setHeader("Accept", "application/json");
        httpPostRequest.setHeader("Content-type", "application/json");
        httpPostRequest.setHeader("Accept-Encoding", "gzip"); // only set this parameter if you would like to use gzip compression

        long t = System.currentTimeMillis();
        HttpResponse response = (HttpResponse) httpclient.execute(httpPostRequest);
        Log.i(TAG, "HTTPResponse received in [" + (System.currentTimeMillis()-t) + "ms]");

        // Get hold of the response entity (-> the data):
        HttpEntity entity = response.getEntity();

        if (entity != null) {
            // Read the content stream
            InputStream instream = entity.getContent();
            Header contentEncoding = response.getFirstHeader("Content-Encoding");
            if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) {
                instream = new GZIPInputStream(instream);
            }

            // convert content stream to a String
            String resultString= convertStreamToString(instream);
            instream.close();
            resultString = resultString.substring(1,resultString.length()-1); // remove wrapping "[" and "]"

            // Transform the String into a JSONObject
            JSONObject jsonObjRecv = new JSONObject(resultString);
            // Raw DEBUG output of our received JSON object:
            Log.i(TAG,"<JSONObject>\n"+jsonObjRecv.toString()+"\n</JSONObject>");

            return jsonObjRecv;
        }

    }
    catch (Exception e)
    {
        // More about HTTP exception handling in another tutorial.
        // For now we just print the stack trace.
        e.printStackTrace();
    }
    return null;
}


private static String convertStreamToString(InputStream is) {
    /*
     * To convert the InputStream to String we use the BufferedReader.readLine()
     * method. We iterate until the BufferedReader return null which means
     * there's no more data to read. Each line will appended to a StringBuilder
     * and returned as String.
     *
     * (c) public domain: http://senior.ceng.metu.edu.tr/2009/praeda/2009/01/11/a-simple-restful-client-at-android/
     */
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line = null;
    try {
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return sb.toString();
}

}

您应该使用始终有效的委托来避免服务器证书验证。 当然,您必须使用https连接。 检查此链接,例如: http : //www.nakov.com/blog/2009/07/16/disable-certificate-validation-in-java-ssl-connections/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM