Android SSL HTTP запрос с использованием самоподписанного сертификата и CA

У меня есть приложение для Android, которое подключается к веб-службе SSL, которую мы размещаем. Веб-сервер Apache и имеет свой собственный CA, который мы создали, и самозаверяющий сертификат SSL.

Я импортировал наш сертификат CA на планшет Android в разделе «Надежные сертификаты пользователя» в разделе «Безопасность».

Я проверил доступ к веб-серверу и могу подтвердить, что сертификат веб-службы отображается как действительный (снимок экрана ниже)

Вот сертификат в настройках безопасности:

Теперь, когда я пытаюсь получить доступ к веб-сервису в моем приложении, я получаю исключение «Нет сертификата равноправного узла».

Это упрощенная реализация 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 в этой реализации?

Ответы на вопрос(2)

Ваш ответ на вопрос