Наконец-то я решил проблему https. Поскольку я боролся, главная проблема была в сервере, конкретно в сертификате.
Android поддерживает только сертификат «BKS», и именно поэтому мы не можем получить ответ от
сервер. Чтобы решить эту проблему, я прочитал более 30 статей и наконец нашел решение.
Шаги, которые я сделал для решения этой проблемы, вы можете увидеть ниже:
Первым делом я сгенерировал файл хранилища ключей .bks из нашего сертификата fidoserver.crt, для этого я прочитал эту статью и выполнил следующее:
- Открыть cmd
- Перейдите в папку JDK «cd X: \ Programs \ Java \ Jdk6 \ bin»
- Вызвать следующую команду:
keytool -import -alias tomcat -file X: //KeyStore/fidoserver.crt
- пароль доступа - хранилище ключей X: //KeyStore/keystore.bks - тип магазина BKS -storepass 222222 -providerClass
org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath
X: //KeyStore/bcprov-jdk16-146.jar
Перед запуском этой команды я скачал файл Bouncy Castle .jar и положил его в папку с сертификатами. После этого я получаю файл keystore.bks, который является правильным файлом сертификата для приложения Android. Я поместил этот файл в папку Android MNC / SDCard. В коде Java я должен написать следующий код, чтобы прочитать этот файл keystore.bbk
KeyStore trustStore = KeyStore.getInstance( "BKS" /*KeyStore.getDefaultType()*/ );
FileInputStream instream = new FileInputStream(new File("/mnt/sdcard/keystore.bks"));
try {
trustStore.load(instream, "222222".toCharArray());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try { instream.close(); } catch (Exception ignore) {}
}
// Create socket factory with given keystore.
SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
Scheme sch = new Scheme("https", socketFactory, 443);
httpclient.getConnectionManager().getSchemeRegistry().register(sch);
HttpGet httpget = new HttpGet("https://10.2.20.20/fido/EzPay/login.php");
System.out.println("executing request " + httpget.getRequestLine());
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
if (entity != null) {
System.out.println("Response content length: " + entity.getContentLength());
}
// Print html.
BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String line = "";
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
Все это позволяет m загрузить наш сертификат с заданным паролем 222222 (пароль, который мы даем при создании хранилища ключей с помощью keytool).
После этого все мои тестовые приложения начинают работать правильно. Теперь я могу отправить запрос в https и получить от него ответ. Я проверил
приложение с FIDO сервером, все отлично работает! Я думаю, что в понедельник я внесу некоторые изменения в приложение EzPay, и это
начнет работать с https-соединениями.
Ссылки