使用 Trustkit 和 Google Cloud Endpoints 实现 SSL pinning

Implementing SSL pinning using Trustkit with Google Cloud Endpoints

我正在使用 Google Cloud Endpoints 与我的 Android 应用的应用引擎后端进行交互。我想实现 public key/SSL 固定。 Android N 及更高版本很容易做到这一点,但我想为 Android 的早期版本实现固定。似乎一种常见的方法是使用 Trustkit.

关于 Trustkit 的入门说明 link,描述了如何通过设置 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 云端点,例如,这是我的 Google 云端点的设置方式代码

        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();
        }
        }

我想知道的是如何在 Android 的早期版本中实现 SSL 固定,例如API16-API23,同时仍以与我的应用程序如上所示相同的方式连接到 Google 云端点?

如果可能的话,我想使用 Trustkit,也许我可以设置一种不同的方式来连接我的 Api 方法以便我可以使用它?如果这不可能,我可以使用 Trustkit 的替代品吗?或者只是一种完全不同的方式来实现 SSL 固定,同时仍然以这种方式使用 Google Cloud Endpoints?

您将不得不停止使用 AndroidHttp helper 并基于它编写您自己的。

不能只调用 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();
}