AndroidアプリをSSLを使用してAndroidアプリとWebサーバー間で情報を転送するように変換しようとすると、問題が発生します。(SocketTimeOutException)
認証局(CA)からPositive SSL証明書を購入し、それを正しく処理するようにサーバーを構成しました。私はそれを私のウェブブラウザでテストし、正しく動作しています。
現在、Androidアプリを変更してhttpではなくhttpsを使用しようとしていますが、自分でhttpsを使用するのはこれが初めてなので、Javaコードに実装する必要のある手順について少し混乱しています。
現在、正しいURLを使用するようにアプリを構成する設定ページで作業しています。たとえば、WebサイトのURL(http://www.mydomain.com)と、関連するページが保存されているアプリケーションフォルダー(myappfolder)を入力するアクティビティに2つのテキストフィールドがあります。
次に、次のコードを使用して接続し、接続変数が正しく構成されていることをテストします。ここで、validateurl.aspxは、ページが存在する場合にJSON文字列を返すWebページです。
protected boolean validateConnectionSettings() {
String result = "";
boolean validated = false;
try {
StringBuilder urlBuilder = new StringBuilder();
urlBuilder.append(tvWebsiteURLValue.getText() + File.separator + tvApplicationMiddlewareValue.getText() + File.separator + "validateurl.aspx");
URL url = new URL(urlBuilder.toString());
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
url = uri.toURL();
URLConnection urlConn = url.openConnection();
BufferedReader in = new BufferedReader( new InputStreamReader(urlConn.getInputStream()));
String inputLine;
while((inputLine = in.readLine()) != null){
result += inputLine;
}
in.close();
if(result.equals("exists")) {
validated = true;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
Log.e(TAG, e.getMessage());
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, e.getMessage());
}
return validated;
}
(http://www.mydomain.com)変数をhttpsを使用するように変換しようとすると、上記のjava.net.SocketTimeoutExceptionが発生します。
私はこの問題をグーグルで検索し、上記のコードでURLConnectionの代わりにHttpsURLConnectionを実装する必要があることを確認したので、次のようにコードを変更しました。
protected boolean validateConnectionSettings() {
String result = "";
boolean validated = false;
try {
StringBuilder urlBuilder = new StringBuilder();
urlBuilder.append(tvWebsiteURLValue.getText() + File.separator + tvApplicationMiddlewareValue.getText() + File.separator + "validateurl.aspx");
URL url = new URL(urlBuilder.toString());
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
url = uri.toURL();
// URLConnection urlConn = url.openConnection();
HttpsURLConnection urlConn = (HttpsURLConnection)url.openConnection();
BufferedReader in = new BufferedReader( new InputStreamReader(urlConn.getInputStream()));
String inputLine;
while((inputLine = in.readLine()) != null){
result += inputLine;
}
in.close();
if(result.equals("exists")) {
validated = true;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
Log.e(TAG, e.getMessage());
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, e.getMessage());
}
return validated;
}
しかし、私はまだjava.net.SocketTimeoutExceptionを受け取ります。私が間違っていることについてのアイデアはありますか?