0

HttpsURLConnectionを使用してHTTPSリクエストを実行しています。

私が接続しようとしているサーバーには自己署名証明書があるため、これにより論理的に要求が失敗します。

ただし、例外によって失敗がプログラムに通知されることはありません。それは失敗するだけで、logcatでその理由を見ることができます。

03-22 17:54:35.203: W/System.err(21147): javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
03-22 17:54:35.203: W/System.err(21147):    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:381)

リクエストに使用するコードは次のとおりです。

HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setUseCaches(false);
connection.setAllowUserInteraction(false);
connection.connect();

理想的には、プログラムがブラウザのように反応するようにします。証明書が信頼されていないことを示すダイアログをポップアップし、場合によってはそれをキーストアに追加して、要求を再試行します。

しかし、例外を取得する方法がわからないので、ここで何をすべきか本当にわかりません。

どんな手掛かり ?

4

2 に答える 2

2

カスタムを実装する必要があることは非常に正しいですが、TrustManagerすべてのSSL証明書を盲目的に受け入れるだけでは絶対にいけません。

Nikolay Elenikovは、そのような証明書を検証するためのカスタムを設定する方法を説明する優れたブログ投稿を持っていますTrustManager

于 2013-03-22T18:42:08.647 に答える
-4

あなたはこのようにそれを行うことができます:

SSLContext sc = SSLContext.getInstance("TLS");
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }
    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        return;
}
    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        return;
    }
} };
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpURLConnection = connection = endPoint.openConnection();
于 2013-03-22T17:30:39.013 に答える