私はあらゆる場所を探しましたが、見つけた情報は私のケースではうまくいきませんでした。誰かが私を助けてくれますか: Android アプリケーションを使用して、サーバー上の特定の URL に POST 要求を送信する必要があります。対象のページは https 暗号化を使用しており、htaccess で保護されています。最後に、サーバーは 14000 などのランダムなポートでリッスンし、証明書ではホスト名がホスト名の URL とは異なります。私はそれが非常に難しいことを知っていますが、私が試したことは何も機能していません。現在、私はこれを試しています:
private void process() {
new Thread(new Runnable() {
public void run() {
String httpsURL = "https://login:password@z-cloud.z-wave.me/ZWaveAPI/Data/0";
HttpResponse httpResponse;
HttpPost httpQuery = new HttpPost(httpsURL);
CustomHttpClient myClient = new CustomHttpClient(myContext);
Log.v("exec", "ready...");
try {
httpResponse = myClient.execute(httpQuery);
if (httpResponse.getStatusLine().getStatusCode() == HttpURLConnection.HTTP_OK) {
Log.v("exec", "it works ?");
}
Log.v("exec", httpResponse.getStatusLine().getStatusCode()+"");
} catch (Exception ex) {
Log.d("httpError", ex.getMessage());
}
}
}).start();
}
および CustomHttpClient クラス:
public class CustomHttpClient extends DefaultHttpClient {
private static Context appContext = null;
private static Scheme httpsScheme = null;
private static Scheme httpScheme = null;
private static String TAG = "MyHttpClient";
public CustomHttpClient(Context myContext) {
appContext = myContext;
if (httpScheme == null || httpsScheme == null) {
httpScheme = new Scheme("http", PlainSocketFactory.getSocketFactory(), 80);
httpsScheme = new Scheme("https", mySSLSocketFactory(), 14000);
}
getConnectionManager().getSchemeRegistry().register(httpScheme);
getConnectionManager().getSchemeRegistry().register(httpsScheme);
}
@SuppressWarnings("finally")
private SSLSocketFactory mySSLSocketFactory() {
SSLSocketFactory ret = null;
try {
final KeyStore ks = KeyStore.getInstance("BKS");
final InputStream inputStream = appContext.getResources().openRawResource(R.raw.certs);
ks.load(inputStream, appContext.getString(R.string.store_pass).toCharArray());
inputStream.close();
ret = new SSLSocketFactory(ks);
ret.setHostnameVerifier(myhostnameVerifier);
} catch (UnrecoverableKeyException ex) {
Log.d(TAG, ex.getMessage());
} catch (KeyStoreException ex) {
Log.d(TAG, ex.getMessage());
} catch (KeyManagementException ex) {
Log.d(TAG, ex.getMessage());
} catch (NoSuchAlgorithmException ex) {
Log.d(TAG, ex.getMessage());
} catch (IOException ex) {
Log.d(TAG, ex.getMessage());
} catch (Exception ex) {
Log.d(TAG, ex.getMessage());
} finally {
return ret;
}
}
X509HostnameVerifier myhostnameVerifier = new X509HostnameVerifier() {
@Override
public void verify(String arg0, SSLSocket arg1) throws IOException {
Log.v("X509", "verified "+arg0);
if("z-cloud.z-wave.me" != arg0)
{
//throw new SSLException("Mismatching hostname");
}
}
@Override
public void verify(String arg0, X509Certificate arg1)
throws SSLException {
Log.v("X509", "called 2");
}
@Override
public void verify(String arg0, String[] arg1, String[] arg2)
throws SSLException {
Log.v("X509", "called 3");
}
@Override
public boolean verify(String host, SSLSession session) {
Log.v("X509", "called 4");
return false;
}
};
}
理由はわかりませんが、エラー 401 が表示されますが、ログインとパスワードは問題ありません。使用している証明書が正しいかどうかよくわかりませんが、本当に必要ですか? 助けてください、単純な投稿リクエストを送信しようとして本当に疲れてきました...