在Android Studio Java代码中接受自签名证书

时间:2017-06-01 13:17:20

标签: java android ssl

我正在尝试连接到在Android Studio中使用自签名证书的网站。我收到错误

  

java.security.cert.CertPathValidatorException:Trust anchor for   未找到证书路径

表示我呼叫openStream()的网址对象。

由于我的代码处于测试环境中,我正在寻找一种解决方案,要么完全禁用证书检查,要么明确允许证书。

我昨天花了几个小时寻找解决方案,但每个指南都有几年的历史,并使用折旧的HTTP库。

2 个答案:

答案 0 :(得分:1)

如果minSdkVersion为24或更高,或者您只需要在此类设备上进行此测试,则可以通过network security configuration配置自签名证书。

如果minSdkVersion为17或更高,则可以使用my backport of network security configuration,最好使用OkHttp。

或者,还有using self-signed certificates with OkHttp的其他食谱。

答案 1 :(得分:0)

除了@CommonsWare的答案之外,如果你的目标是API 14(ISC)或更高版本,你可以选择在应用程序之外的设备上安装其他可信证书。可以找到说明here

使用此方法安装的证书将由设备上的所有应用程序使用。

在API 14-23上,默认情况下将信任用户安装的证书。但是,在API 24(Nougat)上,用户添加的证书的处理已更改,默认情况下不受信任。为了使用户定义的证书可信,请将以下代码添加到network config

public class ProductsListAdapter extends BaseAdapter {

    //reference of activity
    Context context;
    List<Product> productList;

    public ProductsListAdapter(Context context, List<Product> productList) {
        this.context = context;
        this.productList = productList;
    }



    //tells you how many items ARE in a list
    @Override
    public int getCount() {
        return productList.size();
    }

    //tells the item that has been clicked at a particular position
    @Override
    public Object getItem(int position) {
        return productList.get(position);
    }

    //tells the position of an item
    @Override
    public long getItemId(int position) {
        return position;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater layoutInflater = LayoutInflater.from(context);

        convertView = layoutInflater.inflate(R.layout.product_list_item,null);
        Product currentproduct = productList.get(position);

        TextView tvProductName = (TextView) convertView.findViewById(R.id.tvproductname);
        TextView tvPrice = (TextView) convertView.findViewById(R.id.tvprice);
        TextView btnAddToCart = (TextView) convertView.findViewById(R.id.buttonAddToCart);
        //setText only takes string
        tvProductName.setText(currentproduct.name);
        tvPrice.setText(String.valueOf(currentproduct.price));


        return convertView;
    }
}

有关证书处理相关的Nougat变更的更多信息,请访问here