Использование самозаверяющего сертификата недоверяющего сервера приводит к «Не найдена доверенная привязка для пути сертификации» - PullRequest
0 голосов
/ 20 сентября 2018

Я пытался использовать HttpsUrlConnction, чтобы сделать POST-запрос к серверу.Следуя этим шагам, я смог создать трапецеидальный сертификат с сертификатом, который я скачал с сервера.

Вот сертификат, который я вставил в свой трапецеидальный запрос: скачать сертификат

Шаги для создания трапецеидального искажения:

1.Загрузить сертификат с сервера

2. Используя командную строку для создания хранилища ключей из файла pfx.

keytool -importkeystore -srckeystore domain.pfx -srcstoretype pkcs12 -destkeystore name_of_the_keystore_file.jks -deststoretype jks

3.Экспорт сертификата из хранилища ключей

keytool -exportalclient-alias -storepass changeit -file client.cer -keystore client_keystore.jks

4.Создайте хранилище доверенных сертификатов, используя сертификат

keytool -import -v -trustcacerts-alias client-alias -file client.cer -keystore domain-dir / config / cacerts.jks -keypass changeit -storepass changeit

5. Поместить все файлы в папку raw в Androidstudio.

Я создал свой класс Mainactivity, следуя инструкциям разработчика: Безопасность с HTTPS и SSL

Мой класс MainActivity:

private Certificate ca;

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


    try {
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        InputStream ins = getResources().openRawResource(getResources().getIdentifier("trustedbankid", "raw", getPackageName()));
        ca = cf.generateCertificate(ins);
        ins.close();
    } catch (CertificateException e) {
        Log.d("Error", e.toString());
        e.printStackTrace();
    } catch (IOException e) {
        Log.d("Error", e.toString());
        e.printStackTrace();
    }


    try {
        String keystoreType = KeyStore.getDefaultType();
        Log.d("Keystore","Current type: "+KeyStore.getDefaultType());
        KeyStore keyStore = KeyStore.getInstance(keystoreType);
        keyStore.load(null,null);
        keyStore.setCertificateEntry("<aliens name>",ca);

        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);

        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, tmf.getTrustManagers(), null);

        Map<String, String> postData = new HashMap<>();
        postData.put("personalNumber","197564535512");
        postData.put("endUserIp", "<IP Address>");
        postData.put("requirement","\"{\\\"certificatePolicies\\\":[\\\"1.2.752.78.1.5\\\", \\\"1.2.752.71.1.3\\\",\n" +
                "\\\"1.2.752.78.1.2\\\"], \\\"allowFingerprint\\\": false}\"");
        HttpPostAsyncTask task = new HttpPostAsyncTask(postData,context);
        task.execute("https://appapi2.test.bankid.com/rp/v5");





    } catch (KeyStoreException e) {
        Log.d("Error", e.toString());
        e.printStackTrace();
    } catch (CertificateException e) {
        Log.d("Error", e.toString());
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        Log.d("Error", e.toString());
        e.printStackTrace();
    } catch (IOException e) {
        Log.d("Error", e.toString());
        e.printStackTrace();
    } catch (KeyManagementException e) {
        Log.d("Error", e.toString());
        e.printStackTrace();
    }


}

ИВот сообщение об ошибке, которое я получил:

2018-09-20 12: 09: 18.694 32103-32137 / com.example.bankidandroidfinal D / Ограничения: java.security.cert.CertPathValidatorException: доверие привязкидля пути сертификации не найдено.

...