超级简单的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类型一定不要搞错。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
 * 获取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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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格式的证书文件。

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 新鞋穿着脚累怎么办 买了国产乔丹怎么办 跑完1000米吐了怎么办 翻毛鞋脚染色了怎么办 翻毛皮被染色了怎么办 防鹿皮绒鞋染色怎么办 亚瑟士跑鞋挤脚怎么办 亚瑟士跑鞋很紧怎么办 飞线鞋面破了怎么办 新袜子穿了很滑怎么办 鞋底硬脚底板疼怎么办 新鞋前面太硬怎么办 新鞋子鞋底太硬怎么办 不到一米八的身高想扣篮怎么办 鞋胶粘在鞋面上怎么办 鞋子上沾了胶怎么办 休闲鞋号码大了半码怎么办 高跟鞋大了一码怎么办 浅口单鞋买大了怎么办 新鞋子磨大脚趾怎么办 鞋前面磨大脚趾怎么办 白鞋子蹭黑了怎么办 夏天穿皮鞋捂脚怎么办 耐克赤足掉漆怎么办 鞋子买回来小了怎么办 布鞋大了一码怎么办 鞋子买小了一码怎么办 运动鞋小了一码怎么办 帆布鞋小了一码怎么办 脚踝骨韧带断了怎么办 咖啡喝多了失眠怎么办 奥迪q7电瓶没电怎么办 一岁宝宝坐不稳怎么办 2岁宝宝不肯把尿怎么办 踢足球上肢和下肢不协调怎么办 ppt文字放映时重叠怎么办 月子8天腰背疼怎么办 生完五天腰背疼怎么办 生完孩子腰不好怎么办 养了个白眼狼怎么办 孩子学东西很慢怎么办