我正在尝试连接到在Android Studio中使用自签名证书的网站。我收到错误
java.security.cert.CertPathValidatorException:Trust anchor for 未找到证书路径
表示我呼叫openStream()
的网址对象。
由于我的代码处于测试环境中,我正在寻找一种解决方案,要么完全禁用证书检查,要么明确允许证书。
我昨天花了几个小时寻找解决方案,但每个指南都有几年的历史,并使用折旧的HTTP库。
答案 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。