Я пытался использовать 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: доверие привязкидля пути сертификации не найдено.