Ich muss HTTPS verwenden, um POST-Anfragen an einen Server zu senden (mit einem selbstsignierten Zertifikat). So mache ich es:
HttpClient httpClient = getHttpClient();
for (int i = 0; i < PARAMS.length && !mHttpPost.isAborted(); ++i) {
mHttpPost.setURI(URI.create(mUri + "/" + PARAMS[i].getPath()));
mHttpPost.setEntity(new UrlEncodedFormEntity(PARAMS[i].getContents(), HTTP.UTF_8));
HttpResponse response = httpClient.execute(mHttpPost);
[...]
}
Mit getHttpClient() wie folgt definiert:
public static DefaultHttpClient getHttpClient() {
DefaultHttpClient client = null;
// Setting up parameters
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "utf-8");
params.setBooleanParameter("http.protocol.expect-continue", false);
// Setting timeout
HttpConnectionParams.setConnectionTimeout(params, TIMEOUT);
HttpConnectionParams.setSoTimeout(params, TIMEOUT);
// Registering schemes for both HTTP and HTTPS
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory();
sslSocketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
registry.register(new Scheme("https", sslSocketFactory, 443));
// Creating thread safe client connection manager
ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry);
// Creating HTTP client
client = new DefaultHttpClient(manager, params);
return client;
}
Aber ich erhalte eine Ausnahme "Nicht vertrauenswürdiges Serverzertifikat". Ich weiß, dass hier bereits mehrere Fragen zu selbstsignierten Zertifikaten gestellt wurden, aber keine davon hat bei mir funktioniert...
Weiß jemand, wie man das macht?
Einige Details: Ich arbeite mit API Level 4 (Android 1.6) auf einem Emulator.