9

私たちがホストしている SSL Web サービスに接続している Android アプリケーションがあります。Web サーバーは apache であり、作成した独自の CA と自己署名 SSL 証明書を備えています。

セキュリティのユーザーの信頼できる証明書セクションで、CA 証明書を Android タブレットにインポートしました。

Web サーバーへのアクセスをテストしたところ、Web サービス証明書が有効であることを確認できました (下のスクリーンショット)。

有効な証明書

セキュリティ設定の証明書は次のとおりです。

信頼できる証明書

アプリケーションで Web サービスにアクセスしようとすると、「ピア証明書がありません」という例外が発生します。

これは単純化された SSL 実装です。

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // allows network on main thread (temp hack)
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy);

    SchemeRegistry schemeRegistry = new SchemeRegistry();
    //schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
    schemeRegistry.register(new Scheme("https", newSSLSocketFactory(), 443));


    HttpParams params = new BasicHttpParams();

    SingleClientConnManager mgr = new SingleClientConnManager(params, schemeRegistry);

    HttpClient client = new DefaultHttpClient(mgr, params);

    HttpPost httpRequest = new HttpPost("https://our-web-service.com");

    try {
        client.execute(httpRequest);
    } catch (Exception e) {
        e.printStackTrace(); //
    }
}

/* 
 * Standard SSL CA Store Setup //
 */
private SSLSocketFactory newSSLSocketFactory() {

    KeyStore trusted;

    try {
        trusted = KeyStore.getInstance("AndroidCAStore");
        trusted.load(null, null);
        Enumeration<String> aliases = trusted.aliases();

        while (aliases.hasMoreElements()) {
            String alias = aliases.nextElement();
            X509Certificate cert = (X509Certificate) trusted.getCertificate(alias);
            Log.d("", "Alias="+alias);
            Log.d("", "Subject DN: " + cert.getSubjectDN().getName());
            Log.d("", "Issuer DN: " + cert.getIssuerDN().getName());
        }      

        SSLSocketFactory sf = new SSLSocketFactory(trusted);
        sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);

        return sf;

    } catch (Exception e) {
        // TODO Auto-generated catch block
        throw new AssertionError(e);
    }  
}

}

while ループは証明書を吐き出すだけで、ログに自分の CA が表示されます。しかし、まだ「ピア証明書がありません」という例外が発生します。

10-17 18:29:01.234: I/System.out(4006): ピア証明書がありません

この実装では、何らかの形で CA 証明書を手動でロードする必要がありますか?

4

2 に答える 2

4

使用して解決: HttpsURLConnection

URLConnection conn = null;
URL url = new URL(strURL);
conn = url.openConnection();
HttpsURLConnection httpsConn = (HttpsURLConnection) conn;

これは、ユーザーがインストールした CA 証明書で問題なく動作するようです。

于 2013-10-21T10:26:57.837 に答える