当前位置: 首页 > 知识库问答 >
问题:

Android-原因:java.security.cert.CertPathValidatorException:找不到认证路径的信任锚

荀博
2023-03-14
HttpClient client = new HttpClient(context, new ReturnProcess(), params_hash_map);
client.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, URL);
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.widget.Toast;

import org.apache.http.client.ClientProtocolException;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;

public class HttpClient extends AsyncTask<String, String, String>
{
    Context context;
    CallReturn callReturn;
    LinkedHashMap params;

    public HttpClient (Context context, CallReturn callReturn, LinkedHashMap params)
    {
        this.context = context;
        this.callReturn = callReturn;
        this.params = params;
    }

    @Override
    protected String doInBackground(String... url)
    {
        String responseString = null;
        try
        {
            if (isNetworkConnected())
            {

                responseString = getInternetData(url[0], params);
                if (responseString.equalsIgnoreCase("ENDUP") || responseString.equalsIgnoreCase("logout"))
                {
//                    Logs.isLogout = true;
                }
            }
            else
            {
                responseString = "NoInterNet";
            }
        }
        catch (ClientProtocolException e)
        {
            responseString = "ClientProtocolException";
            Utilities.handleException(e);
        }
        catch (IOException e)
        {
            responseString = "IOException";
            Utilities.handleException(e);
        }
        catch (Exception e)
        {
            responseString = "Exception";
            Utilities.handleException(e);
        }
        return responseString;
    }

    @Override
    protected void onPostExecute(String s)
    {
        super.onPostExecute(s);
        callReturn.onCallCompleted(s);
    }

    public boolean isNetworkConnected()
    {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni = cm.getActiveNetworkInfo();
        if (ni == null)
        {
            return false; // There are no active networks.
        }
        else
        {
            return true;
        }
    }

    private String getInternetData(String uri, LinkedHashMap params) throws Exception
    {
//        BufferedReader in = null;
        String data = null;
        try
        {
            /* NEW Working */
//            String url = params[0];
            String USER_AGENT = "Mozilla/5.0";
            StringBuilder tokenUri = new StringBuilder();

            Iterator iterator = params.keySet().iterator();
            while (iterator.hasNext())
            {
                String key=(String)iterator.next();
                String value=(String)params.get(key);
                tokenUri.append(key + value);
            }

            URL obj = new URL(uri);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();

            con.setRequestMethod("POST");
            con.setRequestProperty("User-Agent", USER_AGENT);
            con.setRequestProperty("Accept-Language", "UTF-8");

            con.setDoOutput(true);
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(con.getOutputStream());
            outputStreamWriter.write(tokenUri.toString());
            outputStreamWriter.flush();

            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            String inputLine;
            StringBuilder response = new StringBuilder();

            while ((inputLine = in.readLine()) != null)
            {
                response.append(inputLine);
            }
            in.close();

            data = response.toString();

            return data;
        }
        catch (Exception ex)
        {
            Utilities.handleException(ex);
            return data;
        }
//        finally
//        {
//            if (in != null)
//            {
//                try
//                {
//                    in.close();
//                    return data;
//                }
//                catch (Exception e)
//                {
//                    Utilities.handleException(e);
//                }
//            }
//        }
    }
}

共有1个答案

鲁浩言
2023-03-14

首先,您需要在设备安全设置中安装自签名的SSL.cer文件。然后需要添加network_security_config.xml并将其添加到清单中。

android:networkSecurityConfig="@xml/network_security_config"

有几种配置网络安全的方法:信任证书的方法。我认为最好的方法是只信任自定义CA进行调试:

<network-security-config>  
  <debug-overrides>  
       <trust-anchors>  
            <!-- Trust user added CAs while debuggable only -->
            <certificates src="user" />  
       </trust-anchors>  
  </debug-overrides>  

但您也可以始终信任用户添加的CA:

<network-security-config>
<base-config>
    <trust-anchors>
        <certificates src="system"/>
        <certificates src="user"/>
    </trust-anchors>
</base-config>
 类似资料:
  • 问题内容: android应用有三台主机进行身份验证和授权。最终主机是REST API。首次使用Oauth身份验证和授权过程,它可以正常工作。 但是,如果 用户 在登录并访问REST API提供的服务后 杀死了该应用程序 ,然后再次打开该应用程序,则会出现此问题。 在这段时间内,身份验证和授权过程不会发生,只有REST API会发生。 这是造成原因, 但在首次使用(登录然后使用该应用程序)期间正在

  • 问题内容: 在我的服务器(生产服务器)中,我具有goDaddy ssl证书。我有iOS和Android应用程序都与服务器连接,iOS都没有问题连接,Android版本为4. 一切都很好,但是设备版本为2.3。我总是收到SSLHandshakeException。 我在Android开发人员页面(https://developer.android.com/training/articles/secu

  • 我正在Android上开发一个客户端应用程序,它连接到我的服务器,它在负载均衡器后面的AWS上,我在GoDaddy上创建了一个SSL证书,并将其添加到负载均衡器上。 浏览器上的一切都很顺利,它可以识别证书,但是当我试图用Android调用API时,我遇到了一个例外: 我找到了一些讨论谁说在app上添加证书,但是在证书服务器端是不是就没有办法修复了呢?这不是证书的问题吗?

  • 我正试图通过OKHttp和改装2提出请求。该请求应通过发送证书(必须是p12或crt)完成。我们尝试过不同的方法,但没有人允许我成功。我正在用badssl进行测试。com,它允许我请求此URL:https://client.badssl.com您可以在这里找到证书:https://badssl.com/download/ 我尝试将p12和crt包含在项目的assets文件夹和raw文件夹中,并创建

  • 那里我需要与建立https连接https://free.temafon.ru但我在Android2.3及以下版本上遇到了CertPathValidator异常。我做了什么。 > 最终密钥库密钥库=密钥库。getInstance(“BKS”); 在这里,我使用custom TrustManager,因为服务器以错误的顺序发送证书。 此代码在Android 4.0上运行良好,但在2.3上失败,

  • 问题内容: 我正在尝试建立与HTTPS站点的连接,并且我GOT打印例外:。 我的原始代码如下: 然后,我在这里阅读了Google的文章,并将代码修改为: 关于文件,我使用此站点来检查该站点的证书。我发现了3个证书,我不知道该使用哪个证书。我一一尝试。 一个名称“ VeriSign 3类公共主要证书颁发机构-G5”导致以下例外: 当我使用一个名称为“ VeriSign Class 3 Secure