0

我正在使用 Google Cloud Endpoints 与我的 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 Endpoints,例如,这是在我的代码中为 Google Cloud Endpoints 设置的方式

        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 的早期版本(例如 API16-API23)中实现 SSL 固定,同时仍然以与我的应用程序相同的方式连接到 Google Cloud Endpoints,如上所示?

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

4

1 回答 1

2

您将不得不停止使用AndroidHttp帮助程序并根据它编写自己的帮助程序。

而不是仅仅调用new NetHttpTransport()or 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();
}
于 2018-02-21T18:56:22.383 回答