使用 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();
}
我正在使用 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();
}