2014年2月10日月曜日

[android]javax.net.ssl.SSLException発生

とあるWeb API(https)が突然使えなくなりました。
  • 先月までは大丈夫だった(通信できていた)気がします
  • javax.net.ssl.SSLExceptionが発生するようになりました
  • 私が所有している端末のうち、android2.2のみで不具合が起きていました
  • org.apache.http.impl.client.DefaultHttpClientを使って実装していました
org.apache.http.impl.client.DefaultHttpClientはandroidでは推奨されていないのですね……
私が利用させていただいているWeb API(https)では、javax.net.ssl.HttpsURLConnectionを使うと通信できるようになりましたので、そのときのソースを書いておきます。
try {
    URL url = new URL("https/......");
    HttpsURLConnection urlConnection = null;
    try {
        urlConnection = (HttpsURLConnection) url.openConnection();
        SSLContext context = SSLContext.getInstance("TLS");
        TrustManager tm = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] chain,
                String authType) throws CertificateException {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] chain,
                String authType) throws CertificateException {
            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };
        context.init(null, new TrustManager[] { tm }, null);
        urlConnection.setSSLSocketFactory(context.getSocketFactory());
        InputStream in = urlConnection.getInputStream();
        if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                // 通信成功!!!
                // inを煮るなり焼くなりしてください!
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (KeyManagementException e) {
        e.printStackTrace();
    } finally {
        urlConnection.disconnect();
    }
} catch (MalformedURLException e) {
    e.printStackTrace();
}

0 件のコメント:

コメントを投稿