Реализация закрепления 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();
}