#android #android_studio #openssl
Проблема: Google отказывается публиковать приложение в Google.Play. Причина: The vulnerabilities were fixed in OpenSSL versions beginning with 1.0.1h, 1.0.0m, and 0.9.8za. Используется Android Studio 1.5, ОС Windows 7. Все пакеты обновлены до последних версий. Подскажите, как обновить OpenSSL? Огромное спасибо за помощь! Код приложения: import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.net.URL; import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; public class DBAction { DBAction() { } public static String getData(String id, String passkey, String command, String param){ String response = ""; try { String q = "https://myserver.com"; HostnameVerifier TRUST_ALL_CERTIFICATES = new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }; SSLContext Cur_SSL_Context = null; try { Cur_SSL_Context = SSLContext.getInstance("TLS"); Cur_SSL_Context.init(null, new TrustManager[] { new X509_Trust_Manager() }, new SecureRandom()); } catch (Exception e) { e.printStackTrace(); } HttpsURLConnection.setDefaultHostnameVerifier(TRUST_ALL_CERTIFICATES); HttpsURLConnection.setDefaultSSLSocketFactory(Cur_SSL_Context.getSocketFactory()); URL url = new URL(q); HttpsURLConnection httpsURLConnection= (HttpsURLConnection) url.openConnection(); httpsURLConnection.setRequestMethod("POST"); httpsURLConnection.setDoOutput(true); String urlParameters =DBHelper.PARAM_POST_ID+"="+id+ "&" + DBHelper.PARAM_POST_PASSKEY + "="+passkey; if (param != null) { urlParameters += "&"; urlParameters += DBHelper.PARAM_POST_PARAM; urlParameters += "="; urlParameters = param; } DataOutputStream wr = new DataOutputStream(httpsURLConnection.getOutputStream()); wr.writeBytes(urlParameters); wr.flush(); wr.close(); BufferedReader in = new BufferedReader( new InputStreamReader(httpsURLConnection.getInputStream())); String inputLine; StringBuffer stringBuffer = new StringBuffer(); while ((inputLine = in.readLine()) != null) { stringBuffer.append(inputLine); } in.close(); int responseCode = httpsURLConnection.getResponseCode(); response = stringBuffer.toString(); } catch (Exception e) { System.out.print("Exception = " + e); } return response; } private static class X509_Trust_Manager implements X509TrustManager { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {} @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {} @Override public X509Certificate[] getAcceptedIssuers() { return null; } }; } UPD: рекомендованная Гуглом команда '$ unzip -p YourApp.apk | strings | grep "OpenSSL"' даёт пустой результат UPD2: libs - пуста dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:recyclerview-v7:23.1.1' }
Ответы
Ответ 1
В случае необходимости обновления нативных библиотек есть два пути: Найти готовые .so библиотеки и подключать их в проект в качестве NDK-зависимостей; затем явно в коде вызывать System.loadLibrary("yourlib"); (не забывать ловить исключения, которые эта функция может выбросить) Брать исходники библиотек, отдельно собирать эти библиотеки, затем переходить к п.1 ВАЖНО: Нужно помнить, что есть такой параметр как ABI (подробнее тут). Контролируется он при gradle сборке параметром abiFilter. Для всех архитектур должна быть собрана своя библиотека, которая должна лежать в соответствующей папке.
Комментариев нет:
Отправить комментарий