- 没有得到安卓认可的证书颁发机构颁发的证书.
- 自己颁发的证书, 分临时性的(在开发阶段使用)或在发布的产品中永久性使用的两种.
而只有Android系统认可的机构办法的证书,在使用过程中才不会出现安全提示。
为什么会有人使用自签名的证书呢?
(重要的事重复三遍)免费,免费,免费,不用花费一分钱,在开发阶段写的代码, 测试跟发布的时候也可以用。
三、OkHttp3添加自签名证书
- 如何使用自签名证书?
1.获取证书流有两种方式:
- 将服务端提供的证书文件放到assets文件夹里面,然后获取。(因为是在assets文件下,所以会写入到apk里面)
- 打开证书文件,将证书里面的内容以字符串的形式通过流写入。(不会写入到apk中)
2.创建秘钥,添加证书进去
3.创建信任管理器,并把秘钥初始化到信任管理器里
4.获取SLL上下文,并把信任管理器初始化到SSL里
5.获取socket工厂,设置到okhttpclient中
6.检验主机名
if (UrlConsts.serverUrl.contains(“https://”)){
InputStream cerInputStream = null;
try {
//方式一:在assets中获取证书
cerInputStream = context.getAssets().open(“ssl.cer”);
//方式二:把字符串通过流的形式获取证书
// cerInputStream = new ByteArrayInputStream(cerText.getBytes(“UTF-8”));
//获取socket工厂
SSLSocketFactory sslSocketFactory = SSLUtil.getSSLSocketFactory(cerInputStream);
//okhttp设置socket工厂
okHttpClientBuilder.sslSocketFactory(sslSocketFactory);
} catch (IOException e) {
e.printStackTrace();
}
}
//检验主机名
okHttpClientBuilder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
public class SSLUtil {
/**
-
返回SSLSocketFactory
-
@param certificates 证书的输入流
-
@return SSLSocketFactory
*/
public static SSLSocketFactory getSSLSocketFactory(InputStream… certificates) {
return getSSLSocketFactory(null,certificates);
}
/**
-
双向认证
-
@param keyManagers KeyManager[]
-
@param certificates 证书的输入流
-
@return SSLSocketFactory
*/
public static SSLSocketFactory getSSLSocketFactory(KeyManager[] keyManagers, InputStream… certificates) {
try {
//获取证书工厂
CertificateFactory certificateFactory = CertificateFactory.getInstance(“X.509”);
//创建秘钥,添加证书进去
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null);
int index = 0;
for (InputStream certificate : certificates) {
String certificateAlias = Integer.toString(index++);
keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));
try {
if (certificate != null) certificate.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//创建信任管理工厂
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
//初始化信任管理器
trustManagerFactory.init(keyStore);
//获取SSL上下文对象
SSLContext sslContext = SSLContext.getInstance(“TLS”);
//初始化信任管理器
sslContext.init(keyManagers, trustManagerFactory.getTrustManagers(), new SecureRandom());
//获取socket工厂
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
return socketFactory;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
测试运行,完美解决。
2.信任所有证书(不建议使用)
服务端提供的证书文件,如果服务端更改了需要客户端进行相应的更改,否则无法请求服务端数据。如果想不换证书可以继续访问,可以通过X509TrustManager信任所有的证书,以达到客户端不换证书文件就能获取到服务端数据,但不建议这样使用!!!
/**
*信任所有证书(不建议使用)
- @return
*/
public static SSLSocketFactory getAllSSLSocketFactory(){
//创建X509信任管理器
TrustManager[] trustManagers = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
};
try {
//获取SSL上下文对象
SSLContext sslContext = SSLContext.getInstance(“TLS”);
//初始化无信任管理器
sslContext.init(null, trustManagers, new SecureRandom());
//获取socket工厂
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
return socketFactory;
} catch (NoSuchAlgorithmException | KeyManagementException e) {
e.printStackTrace();
}
return null;
}
四、Glide4.0以上 添加自签名证书
Glide 直接加载没有权威机构颁发的证书https的URL会直接抛出错误SSLHandshakeException(CertPathValidatorException证书路径验证器异常)
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
看到CertPathValidatorException这个异常,不用多说也知道什么原因导致的,所以我们需要对Glide内部的Okhttp3进行https自签名。
- 从Glide官网查到,需 添加Glide需要的依赖
// Glide图片加载库
api ‘com.github.bumptech.glide:glide:4.11.0’
// Glide需要处理注解时的依赖库,用于处理注解并生成java类
annotationProcessor ‘com.github.bumptech.glide:compiler:4.11.0’
// Glide集成OkHttp时需要使用的库
api ‘com.github.bumptech.glide:okhttp3-integration:4.11.0’
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)
最后
跳槽季整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)文章来源:https://www.toymoban.com/news/detail-853050.html
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-MCtIkE3e-1711538416227)]文章来源地址https://www.toymoban.com/news/detail-853050.html
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
到了这里,关于Android Okhttp3添加https自签名证书以及Glide4的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!