[解決済み]-以下を参照
HTTPS接続を介してAndroid2.2でREST対応のWCFサービスからJSONデータを取得しようとすると、例外が発生します。それから私は何か非常に奇妙なことが起こっていることに気づきました。私の電話でアプリケーションを実行すると、それはうまく機能し、美しいJSONデータを取り戻すでしょう。ただし、エミュレータでアプリケーションを実行すると、「httpclient.execute(request)」が実行されるとすぐにクラッシュし、SLLException:ピア証明書がありませんでした。私のWCFサービスには有効なRapidSSL署名付き証明書(CA)があったため、これは特に奇妙です。さらに、IIS内でクライアント証明書が不要であることを確認しました。(また、この関数はUIThread!で実行されていませんでした。別のスレッドで実行されていました。)
私のコード:
public Object getJSON(String URL, HashMap<String, String> parameters, String METHOD, String TAG) {
try {
this.TAG = TAG;
// Send GET request to <service>/METHOD?params
//Target API(8) for AndroidHttpClient and Target API(5) for DefaultHttpClient
AndroidHttpClient client = AndroidHttpClient.newInstance("Android");
String params = "?";
if(parameters != null){
for (Entry<String, String> para : parameters.entrySet()) {
params = params + (String)para.getKey() + "=" + (String)para.getValue() + "&";
}
params = params.substring(0, params.length() - 1);
Log.i("U's n P's", params);//Username and password check
}
HttpGet request = new HttpGet(URL + METHOD + params);
Log.i(TAG, request.getRequestLine().toString());
request.setHeader("Accept", "application/json");
request.setHeader("Content-type", "application/json");
HttpResponse response = client.execute(request);//Crashes here
HttpEntity responseEntity = response.getEntity();
// Read response data into buffer
char[] buffer = new char[(int)responseEntity.getContentLength()];
InputStream stream = responseEntity.getContent();
InputStreamReader reader = new InputStreamReader(stream);
reader.read(buffer);
stream.close();
今、私は解決策を探してみましたが、基本的にこの状況に合う解決策はありませんでした。
[解決]
ホストファイルを編集してからエミュレータがスナップショットを実行していたため、DNSでサービスを設定する必要はありませんでした。毎回スナップショットを実行したので、ここに問題があります。日付は、エミュレーターで時刻18:48の2012年10月24日に設定されました。次に、証明書を検証した日付が2012年10月27日14:45であることに気付きました。どうやら「インターネットから時間を取得する」オプションはエミュレータでは機能しません。これにより、エミュレータに検証済みの証明書が技術的になかったため、httpclientは「ピア証明書なし」例外をスローしました。悲しい部分は、「android」または「https android wcf」というキーワードでこの例外の解決策を検索すると、自己署名証明書に関連する問題を抱えている人々の結果しか得られないことです。
TL; DR:どうやら、将来的に検証された証明書は受け入れられなくなります。