簡體   English   中英

Android SSL SNI連接問題

[英]Android SSL SNI connection issues

我有一個用於消費和更新數據到Web服務器的應用程序,最近,由於存儲了個人信息,應用程序所有者決定切換到安全連接。

該服務器已經設置為SNI,並且我已經使用digicert對其進行了檢查 ,該服務器可以正常運行,並且似乎已正確設置,但是其備用名稱上包含路徑* .host.com(我不確定是否可以對於SNI是否正常)。

iOS的運行就像一個咒語,但是在Android上卻出現此錯誤:

java.security.cert.CertPathValidatorException:找不到證書路徑的信任錨。

我當前的連接方法如下所示:

    URL url = new URL(postURL);
    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
    SSLContext sc;
    sc = SSLContext.getInstance("TLS");

    sc.init(null, null, new java.security.SecureRandom());
    conn.setSSLSocketFactory(sc.getSocketFactory());

    String userpass = "bob" + ":" + "12345678";
    String basicAuth = "Basic " + Base64.encodeToString(userpass.getBytes(), Base64.DEFAULT);
    conn.setRequestProperty("Authorization", basicAuth);

    conn.setReadTimeout(7000);
    conn.setConnectTimeout(7000);
    conn.setRequestMethod("POST");
    conn.setDoInput(true);

    conn.connect();

    InputStream instream = conn.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(instream));

    StringBuilder everything = new StringBuilder();
    String line;

    while ((line = reader.readLine()) != null) {
        everything.append(line);
    }

    JSONObject jsonObject = new JSONObject(everything.toString());

    return jsonObject;

我不太確定這里是什么問題,但是嘗試連接到https://sni.velox.ch/可以給我一個很長的答案,似乎很成功。

另外,我這里確實有證書的pem密鑰,但是我不知道在這種情況下如何添加它。

通常,使用自簽名證書時會出現此錯誤,在這種情況下,您在發出請求時必須使用證書。

此外,由於未包含路徑* .host.com ,您可能會收到此錯誤。

您可以在構建HttpsURLConnection時嘗試以下代碼來通過證書。 請不要忘記將ca.pem文件復制到資產文件夾。

private HttpsURLConnection buildSslServerConnection() {
    HttpsURLConnection urlConnection = null;
    try {
        // Load CAs from an InputStream
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        InputStream caInput = new BufferedInputStream(context.getAssets().open("ca.pem"));
        Certificate ca;
        try {
            ca = cf.generateCertificate(caInput);
        } finally {
            caInput.close();
        }

        // Create a KeyStore containing our trusted CAs
        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca);

        // Create a TrustManager that trusts the CAs in our KeyStore
        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);

        // Create an SSLContext that uses our TrustManager
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, tmf.getTrustManagers(), null);

        // Tell the URLConnection to use a SocketFactory from our SSLContext
        urlConnection = (HttpsURLConnection) url.openConnection();
        urlConnection.setSSLSocketFactory(context.getSocketFactory());
        urlConnection.setRequestMethod("POST");
        urlConnection.setRequestProperty("Authorization", "Basic" + Base64.encodeToString(userpass.getBytes(), Base64.DEFAULT));
        urlConnection.setConnectTimeout(7000);
        urlConnection.setReadTimeout(7000);
        urlConnection.setInstanceFollowRedirects(false);
        urlConnection.setUseCaches(false);
        urlConnection.setAllowUserInteraction(false);
        urlConnection.setDoOutput(false);
    } catch (KeyManagementException e) {
        LOG.error("Error while checking server connectivity: ", e);
    } catch (CertificateException e) {
        LOG.error("Error while checking server connectivity: ", e);
    } catch (FileNotFoundException e) {
        LOG.error("Error while checking server connectivity: ", e);
    } catch (KeyStoreException e) {
        LOG.error("Error while checking server connectivity: ", e);
    } catch (NoSuchAlgorithmException e) {
        LOG.error("Error while checking server connectivity: ", e);
    } catch (MalformedURLException e) {
        LOG.error("Error while checking server connectivity: ", e);
    } catch (IOException e) {
        LOG.error("Error while checking server connectivity: ", e);
    }
    return urlConnection;
}

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM