SSLException: Android веб-просмотр - PullRequest
0 голосов
/ 28 марта 2019

Веб-просмотр Android (api 21+) не может достичь локального IP-адреса, например: 172.18.17.16.5432

Перепробовал много решений, таких как Доверие всем сертификатам с использованием HttpClient через HTTPS в интернете но ответа нет.

У нас есть: 1. Собственный сертификат. 2. Локальный сервер как 171.18.13.12:3456 3. Включает с ПК, как Chrome, но говорит, что это небезопасно (перекрестный адрес https) 4. У нас также есть веб-браузер Android. 5. И мы должны пойти на сервер.

Но это не так.

webView.setBackgroundColor(Color.TRANSPARENT);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setAllowContentAccess(true);
    webView.getSettings().setAllowFileAccess(true);
    webView.getSettings().setSupportZoom(true);
    webView.getSettings().setDomStorageEnabled(true);
    String newUA = "clientName";
    webView.getSettings().setUserAgentString(newUA);
    if (!webView.equals(webViewLocal))
        webView.setWebViewClient(new WebClient(webViewLocal, this));
    else {
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                progressDialog(view, true);
                super.onPageStarted(view, url, favicon);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                progressDialog(view, false);
            }
        });
    }
    webView.setWebChromeClient(new ChromeClient());

    webView.getSettings().setUseWideViewPort(false);
    webView.getSettings().setLoadWithOverviewMode(false);

И доверие:

private void addToTrustStore(KeyStore trustStore) {
    KeyManagerFactory kmfactory = null;
    try {
        kmfactory = KeyManagerFactory.getInstance(
                KeyManagerFactory.getDefaultAlgorithm());
        kmfactory.init(trustStore, pass_cert.toCharArray());
        KeyManager[] keymanagers = kmfactory.getKeyManagers();

        TrustManagerFactory tmf = TrustManagerFactory
                .getInstance(TrustManagerFactory.getDefaultAlgorithm());

        tmf.init(trustStore);

        SSLContext sslContext = SSLContext.getInstance("TLS");

        sslContext.init(keymanagers, tmf.getTrustManagers(), new SecureRandom());

        SSLContext.setDefault(sslContext);

    } catch (NoSuchAlgorithmException | UnrecoverableKeyException | KeyStoreException | KeyManagementException e) {
        e.printStackTrace();
    }
}

private void loadCertificateAndPrivateKey() {
    try {
        InputStream certificateFileStream = getClass().getResourceAsStream("/assets/" + cert_file);

        KeyStore keyStore = KeyStore.getInstance("SomeName");
        keyStore.load(certificateFileStream, pass_store != null ? pass_store.toCharArray() : null);

        addToTrustStore(keyStore);

        String alias = "someName";

        Key key = keyStore.getKey(alias, pass_cert.toCharArray());
        if (key instanceof PrivateKey) {
            mPrivateKey = (PrivateKey) key;
            Certificate cert = keyStore.getCertificate(alias);
            mCertificates = new X509Certificate[1];
            mCertificates[0] = (X509Certificate) cert;
        }

        certificateFileStream.close();

    } catch (Exception e) {
        Log.e(LOG_TAG, e.getMessage());
    }
}

Приложение также выбрасывает

io.netty.handler.codec.DecoderException: javax.net.ssl.SSLException: Received fatal alert: certificate_unknown

Вопрос: это какой-то способ разрешить доступ к моему серверу без регистрации домена? Если да - пожалуйста, помогите. Или что я делаю не так?

...