超级简单的retrofit使用自签名证书进行HTTPS请求的教程
来源:互联网 发布:怎么做淘宝自然排名 编辑:程序博客网 时间:2024/05/20 01:35
1. 前言
HTTPS越来越成为主流,谷歌从 2017 年起,Chrome 浏览器将也会把采用 HTTP 协议的网站标记为「不安全」网站;苹果从 2017 年 iOS App 将强制使用 HTTPS;在国内热火朝天的小程序也要求必须使用 HTTPS 请求。那么为什么要使用HTTPS呢?首先说为什么使用https,简单点说就是为了防止数据传输过程中信息被窃取或偷换,防止中间人攻击。
2. 准备BKS证书,将证书放到项目raw目录下
准备.cer文件
可以跟后台开发人员直接拿,也可以直接在网站上下载
在网站上下载:
点击地址栏前面的小锁头,然后点击证书信息
将.cer转换为.bks
首先要下载bouncycastle的JAR
http://repo2.maven.org/maven2/org/bouncycastle/bcprov-jdk16/1.46/bcprov-jdk16-1.46.jar
解压后在当前文件夹执行以下命令
keytool -importcert -v -trustcacerts -file “server.cert” -alias server_alias -keystore “server.bks” -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath “bcprov-jdk16-146.jar” -storetype BKS -storepass password
黑体字部分是你要修改的,其中 “server.cert”是原cer证书的名字,“server_alias”你不用管,“server.bks”是转换后bks证书的名字,“password”是你证书的密码,下边会用到的。
成功后将.bks证书文件放到项目的raw目录下。
3. 获取SSLSocketFactory
这里是HTTPS证书认证的关键代码,注意password和设置keystore的bks类型一定不要搞错。
/**
* 获取bks文件的sslsocketfactory
* @param context
* @return
*/
public
static
SSLSocketFactory getSSLSocketFactory(Context context) {
final
String CLIENT_TRUST_PASSWORD =
"123456"
;
//信任证书密码,该证书默认密码是123456
final
String CLIENT_AGREEMENT =
"TLS"
;
//使用协议
final
String CLIENT_TRUST_KEYSTORE =
"BKS"
;
SSLContext sslContext =
null
;
try
{
//取得SSL的SSLContext实例
sslContext = SSLContext.getInstance(CLIENT_AGREEMENT);
//取得TrustManagerFactory的X509密钥管理器实例
TrustManagerFactory trustManager = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
//取得BKS密库实例
KeyStore tks = KeyStore.getInstance(CLIENT_TRUST_KEYSTORE);
InputStream is = context.getResources().openRawResource(R.raw.traint);
try
{
tks.load(is, CLIENT_TRUST_PASSWORD.toCharArray());
}
finally
{
is.close();
}
//初始化密钥管理器
trustManager.init(tks);
//初始化SSLContext
sslContext.init(
null
, trustManager.getTrustManagers(),
null
);
}
catch
(Exception e) {
e.printStackTrace();
Log.e(
"SslContextFactory"
, e.getMessage());
}
return
sslContext.getSocketFactory();
}
4.配置retrofit
String baseUrl =
"https://skyish-test.yunext.com"
;
int
[] certificates = {R.raw.traint};
String[] hostUrls = {baseUrl};
OkHttpClient client =
new
okhttp3.OkHttpClient.Builder()
.addInterceptor(
new
HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.sslSocketFactory(HTTPSUtils.getSSLSocketFactory(context))
//.hostnameVerifier(HTTPSUtils.getHostNameVerifier(hostUrls))
.readTimeout(
10
, TimeUnit.SECONDS)
.connectTimeout(
10
, TimeUnit.SECONDS)
.build();
Retrofit retrofit =
new
Retrofit.Builder().baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(client)
.build();
配置好这个就可以使用HTTPS连接了。
5.常见错误
SSLContext is not initialized.
原因:
1. 证书和证书密码不匹配。
2. 使用了错误的证书。证书类型不对,记得要用bks格式的证书文件。
- 超级简单的retrofit使用自签名证书进行HTTPS请求的教程
- 超级简单的retrofit使用自签名证书进行HTTPS请求的教程
- openssl 简单的https验证 自签名证书
- retrofit遇上https自签名证书
- Android使用OkHttp访问自签名证书的Https接口
- iOS使用自签名证书实现HTTPS请求
- iOS使用自签名证书实现HTTPS请求
- iOS使用自签名证书实现HTTPS请求
- iOS使用自签名证书实现HTTPS请求
- iOS使用自签名证书实现HTTPS请求
- iOS, 使用自签名证书https请求,(NSURLSession)
- iOS基于AFNetworking使用自签名证书实现HTTPS请求
- iOS使用自签名证书实现HTTPS请求
- Volley 信任自签名的 Https 证书
- Android使用OkHttp请求自签名的https网站
- 自签名证书实现HTTPS请求
- iOS AFNetWorking HTTPS自签名证书请求
- iOS 用自签名证书实现 HTTPS 请求的原理实例讲解
- [模板]二叉树后序遍历
- 10·RHCSA配置NTP服务
- 调用函数计算一个正整数到1的和,并把和显示再主函数上
- CAKeyframeAnimation keyPath可以是用的key
- 模板整理: 高斯消元
- 超级简单的retrofit使用自签名证书进行HTTPS请求的教程
- 2017.11.9总结(最后一场)
- StringBuilder,Stringbuffer
- JAVA I/O 流学习(二) 读写URL请求内容
- 26. Remove Duplicates from Sorted Array
- AutoControlMapper 基于.net 的一个WinForm自动更新和读取类
- find your present (2)(初识异或)
- Mangos源码分析(5):服务器结构探讨之最终的结构
- 【机器学习】--决策树