Как получить доступ к SSL-соединению через Android?

Я начал следовать учебнику, который не был обложен вокруг Android и получил следующее:

    System.setProperty("javax.net.ssl.trustStore", "truststore");
    System.setProperty("javax.net.ssl.trustStorePassword", "password");

    SSLSocketFactory ssf = (SSLSocketFactory) SSLSocketFactory.getDefault();
    try {
        Socket s = ssf.createSocket("192.168.2.11", 6543);
        PrintWriter out = new PrintWriter(s.getOutputStream());
        while (true){
            out.println("SSL TEST");
            Log.d("DATA", "DATA SENT");
        }



    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Я думаю, это сводится к нескольким вопросам:

  • У меня нет собственного хранилища доверия, созданного, но поиск через учебники и многое другое онлайн, я не уверен, как его создать. Есть ли способ создать или изменить хранилище доверия, чтобы иметь в нем необходимые мне сертификаты? (Я использую самозаверяющий сертификат, если это имеет значение)

  • Как я могу упростить работу с SSL-рукопожатием? Прямо сейчас, я получаю сообщение:

    javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
    

    Честно говоря, я действительно не понимаю, что это значит.

  • Какие настройки или файлы необходимо изменить на моем устройстве Android, чтобы убедиться, что это соединение может случиться?

Ответ 1

1) Это зависит. У вас есть собственный сертификат на стороне сервера, и вы пытаетесь подтвердить свою личность на устройстве Android? Или вы на стороне андроида пытаетесь проверить свою идентификацию на сервере? Если это первый, то перейдите по этой ссылке: http://www.codeproject.com/KB/android/SSLVerification_Android.aspx?display=Mobile

Вы хотите обратить особое внимание на то, где он делает файл KeyStore.

2) Причина, по которой вы получаете эту ошибку, связана с тем, что она не доверяет подключаемому серверу, потому что вы не создали доверительное хранилище правильно или вы подключаетесь к серверу, сертификат которого не был добавлен в доверительный магазин, С чем именно вы пытаетесь подключиться?

3) Убедитесь, что у вас есть <uses-permission android:name="android.permission.INTERNET" /> в файле manifest.xml.

Edit Мои извинения, пожалуйста, ознакомьтесь с изменениями, внесенными мной в первый абзац.

Вот часть для инициализации хранилища ключей и доверия

SSLcontext sslContext = SSLContext.getDefault();

KeyStore trustSt = KeyStore.getInstance("BKS");
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
InputStream trustStoreStream = this.getResources().openRawResource(R.raw.truststore);
trustSt.load(trustStoreStream, "<yourpassword>".toCharArray());
trustManagerFactory.init(trustStre);

KeyStore keyStore = KeyStore.getInstance("BKS");
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
InputStream keyStoreStream = this.getResources().openRawResource(R.raw.keystore);
keyStore.load(keyStoreStream, "<yourpassword>".toCharArray());
keyManagerFactory.init(keyStore, "<yourpassword>".toCharArray());

sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);

Ответ 2

Вам не нужно ваше собственное доверительное учреждение, если партнер не использует самозаверяющие сертификаты. JRE поставляется с доверительным магазином, который используется по умолчанию, который доверяет сертификатам, выпущенным всеми основными ЦС.