Отправка приложения работы в формате JSON в REST API через POST: получение исключения SSL

1

Контекст:

Я хочу подать заявку на работу в компанию, инструкции для этого размещены здесь ("Применить через наш REST API"): https://3ided.be.com/contact/join-us

Что я наделал:

Я написал простое приложение для отправки приложения, он использует библиотеку Android Asynchronous HTTP Client для выполнения большинства задач: http://loopj.com/android-async-http/

Это код для приложения:

Основная деятельность:

package jobsrc;
import java.io.UnsupportedEncodingException;

import org.apache.http.Header;
import org.apache.http.entity.StringEntity;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.example.jobapp.R;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.loopj.android.http.*;


public class MainActivity extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        Button b = (Button) findViewById(R.id.btnSend);
        b.setOnClickListener(new OnClickListener() {            
            @Override
            public void onClick(View v) {
                sendRequest();
            }
        });     
    }

    private void sendRequest() {
        final String TAG = "jobApp";
        Log.i(TAG, "Sending post..");   

        AsyncHttpClient client = new AsyncHttpClient();
        JSONObject params = new JSONObject();
//      //fill params here..
        try {
            params.put("name", "TEST");     
            params.put("email", "TEST");
            params.put("message", "TEST");
            params.put("cv-link", "TEST");
            params.put("github-profile", "TEST");
        } catch (JSONException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        StringEntity se = null;
        try{
            se = new StringEntity(params.toString());
        }catch(UnsupportedEncodingException e){

        }

        se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));

        //DEBUG
        //requestbin test: ("http://requestb.in/18jj7lk1?inspect" to see result)
        //client.post(null, "http://requestb.in/18jj7lk1", se, "application/json", new JsonHttpResponseHandler(){

        //submission URL: transmission fails with error: 
        //  "javax.net.ssl.SSLException: hostname in certificate didn't match: <3sidedcube.com> != <*.cubeapis.com> OR <*.cubeapis.com> OR <cubeapis.com>"
        client.post(null, "https://3sidedcube.com/api/jobs", se, "application/json", new JsonHttpResponseHandler(){

            @Override
            public void onSuccess(int statusCode, Header[] headers,
                    JSONArray response) {
                Log.i(TAG, "Success: array");
                Log.i(TAG, response.toString());
                super.onSuccess(statusCode, headers, response);
            }

            @Override
            public void onSuccess(int statusCode, Header[] headers,
                    JSONObject response) {
                Log.i(TAG, "Success: object");
                Log.i(TAG, response.toString());
                super.onSuccess(statusCode, headers, response);
            }

            @Override
            public void onSuccess(int statusCode, Header[] headers,
                    String responseString) {
                Log.i(TAG, "Success: string");
                Log.i(TAG, responseString);
                super.onSuccess(statusCode, headers, responseString);
            }

            @Override
            public void onFailure(int statusCode, Header[] headers,
                    String responseString, Throwable throwable) {
                // TODO Auto-generated method stub
                super.onFailure(statusCode, headers, responseString, throwable);
            }

            @Override
            public void onFailure(int statusCode, Header[] headers,
                    Throwable throwable, JSONArray errorResponse) {
                // TODO Auto-generated method stub
                super.onFailure(statusCode, headers, throwable, errorResponse);
            }

            @Override
            public void onFailure(int statusCode, Header[] headers,
                    Throwable throwable, JSONObject errorResponse) {
                // TODO Auto-generated method stub
                super.onFailure(statusCode, headers, throwable, errorResponse);
            }

        });

    }
}

main_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/btnSend"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:text="Send.." />

</RelativeLayout>

Проблема:

Когда я запускаю свой код, я получаю ответ onFailure, который получает исключение SSL, debug показывает исключение как:

"javax.net.ssl.SSLException: hostname in certificate didn't match: <3sidedcube.com> != <*.cubeapis.com> OR <*.cubeapis.com> OR <cubeapis.com>"

Что мне нужно знать:

Это моя вина или их? Я не эксперт по подобным вещам, поэтому очень возможно, что я делаю что-то глупое!

Я протестировал свой запрос POST с помощью RequestBin (" http://requestb.in/18jj7lk1?inspect "), и это казалось ECHO правильно и точно, поэтому я чувствую, что это может быть проблемой на их стороне?

В любом случае, если это моя вина, я хочу исправить то, что я делаю, если это их вина, я пришлю им электронное письмо и объясню им вопрос.

Дайте мне знать, что вы думаете, и спасибо за помощь!

  • 0
    3sidedcube.com действительно предоставляет сертификат с CN=*.cubeapis.com . Либо вы можете отключить проверку имени хоста, перезаписав контекст SSL, либо запросить у поставщика услуг правильный хост.
Теги:
ssl
rest

2 ответа

0
Лучший ответ

Либо 3sidedcube.com должен исправить свой сертификат с точным доменом (CN), либо вам нужно отключить проверку имени узла. Вы можете использовать приведенный ниже код, чтобы обойти проверку.

  ....
  KeyStore trustStore=KeyStore.getInstance(KeyStore.getDefaultType());
  trustStore.load(null,null);
  SSLSocketFactory socketFactory=new InsecureSSLSocketFactory(trustStore);
  socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
  client.setSSLSocketFactory(socketFactory);
  client.post(null, "https://3sidedcube.com/api/jobs", se, "application/json", new         JsonHttpResponseHandler(){
  .....
  • 0
    Спасибо, это решило проблему с SSL. У меня были небольшие трудности с импортом SSLSocketFactory, так как он находится в двух пространствах имен, но он работал нормально, когда я это исправил. (если у кого-то такая же проблема, убедитесь, что вы импортируете версию Apache). К сожалению, теперь я получаю 404, когда отправляю свой запрос на « 3sidedcube.com/api/jobs », так что я полагаю, что их настройка проблематична.
0

Я один из разработчиков на 3 Sided Cube. Спасибо, что заметили нашу преднамеренную ошибку с API ;-)

Если вы попробуете свой запрос сейчас по адресу https://3ided.cube.com/api/job, вы должны получить более полезный ответ.

Удачи!

  • 0
    Круто, мой код сработал с первого раза :) спасибо, что ответили мне!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню