Реализация закрепления SSL с использованием Trustkit с конечными точками Google Cloud

Я использую конечные точки Google Cloud для взаимодействия с бэкендом движка приложения для моего приложения Android. Я хочу реализовать закрепление открытого ключа /SSL. Это легко сделать для Android N и выше, но я хочу реализовать закрепление для более ранних версий Android. Кажется, что обычный способ сделать это - использовать Trustkit.

В примечаниях "Приступая к работе" по ссылке Trustkit описано, как настроить его, например, путем настройки SSLSocketFactory.

  // HttpsUrlConnection
  HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
  connection.setSSLSocketFactory(TrustKit.getInstance().getSSLSocketFactory(serverHostname));

  // OkHttp 2.x
  OkHttpClient client =
    new OkHttpClient()
        .setSSLSocketFactory(TrustKit.getInstance().getSSLSocketFactory(serverHostname));

Но я не уверен, как применить это к конечным точкам Google Cloud из-за способа настройки соединения, например, вот как он настроен для конечных точек Google Cloud в моем коде

        import com.xxxx.backend.myApi.MyApi;

    //I believe the MyApi class is generated automatically as part of the Google Cloud Endpoints integration in Android Studio.

        class EndpointsAsyncTask  extends AsyncTask<HashMap, Void, String> {

        @Override
        protected String doInBackground(HashMap... params) {

        HashMap<String, String> dict = params[0];
        String data = dict.get("dataString");


         MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null)
                                .setRootUrl("https://xxxxx").setApplicationName("xxxx");

        myApiService = builder.build();

        //This calls the API method
        return myApiService.customApiMethodName(data).execute().getDict().toString();
        }
        }

Я хочу узнать, как я могу реализовать закрепление SSL в ранних версиях Android, например, API16-API23, при этом все еще подключаясь к конечным точкам Google Cloud, точно так же, как мое приложение, как показано выше?

Если возможно, я хотел бы использовать Trustkit, может быть, есть другой способ, которым я могу настроить, как соединиться с моими методами API, чтобы я мог его использовать? Если это невозможно, есть ли альтернатива Trustkit, который я могу использовать? или просто совершенно другой способ реализации закрепления SSL при использовании Google Cloud Endpoints таким образом?

1 ответ

Решение

Вы должны прекратить использование AndroidHttp помощник и написать свой, основанный на этом.

Вместо того, чтобы просто звонить new NetHttpTransport() или же new ApacheHttpTransport(), вместо этого вы должны использовать их строителей, например:

public static HttpTransport newCompatibleTransport(String hostname) {
  SSLSocketFactory factory = TrustKit.getInstance().getSSLSocketFactory(serverHostname);
  if (AndroidUtils.isMinimumSdkLevel(9)) {
    return new NetHttpTransport.Builder()
        .setSslSocketFactory(factory)
        .build();
  }
  return new ApacheHttpTransport.Builder()
      .setSslSocketFactory(factory)
      .build();
}
Другие вопросы по тегам