HTTPS stringrequest с использованием Android Volley - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь отправить запросы VolleySingleton на мой https-сервер, я использовал хранилище ключей, чтобы сохранить сертификат в файл .bks, но все еще не получаю ответа на запрос. Я делаю хранилище ключей с сертификатом, полученным от компании ssl. без промежуточных сертификатов. Я использую:

keytool -importcert -v -trustcacerts -file "C:/cert.cer" -alias test -keystore "C:/certificate.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "C:/bcprov-jdk16-145.jar" -storetype BKS -storepass testpass

мой залп синглтон:

public class VolleySingleton{

private static VolleySingleton instance;
private RequestQueue requestQueue;
private static Context ctx;

private VolleySingleton(Context context) {
    ctx = context;
    requestQueue = getRequestQueue();

}

public static synchronized VolleySingleton getInstance(Context context) {
    if (instance == null) {
        instance = new VolleySingleton(context);
    }
    return instance;
}

public RequestQueue getRequestQueue() {
    if (requestQueue == null) {
            requestQueue = Volley.newRequestQueue(ctx.getApplicationContext(), new HurlStack(null, newSslSocketFactory()));
    }
    return requestQueue;
}
public <T> void addToRequestQueue(Request<T> req) {

    int socketTimeout = 90000;
    RetryPolicy policy = new DefaultRetryPolicy(socketTimeout,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
    req.setRetryPolicy(policy);
    getRequestQueue().add(req);
}

private SSLSocketFactory newSslSocketFactory() {

    try {
        KeyStore trusted = KeyStore.getInstance("BKS");
        InputStream in = ctx.getApplicationContext().getResources().openRawResource(R.raw.certificate);
        try {
            trusted.load(in, ctx.getString(R.string.keystore).toCharArray());
        } finally {
            in.close();
        }

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

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

        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                Log.i("Volley","Verifing host:"+hostname);
                return true;
            }
        });

        SSLSocketFactory sf = context1.getSocketFactory();
        return sf;
    } catch (Exception e) {
        throw new AssertionError(e);
    }
}

}

Приложение работало нормально с запросом к домену http, проблема возникла, когда я установил ссль на домен. Я не получаю сообщение об ошибке из строки запроса залпа

Что я делаю не так? Я думаю, что проблема в хранилище ключей, какой сертификат у меня в хранилище ключей? Я пробовал с root и промежуточный тоже отделены, но ничего не получил

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...