记录一次retrofit https

今天我们正式环境需要换成https

首先后台给我一个阿里云的压缩包,里面包含一个.pfx 和.txt的文件 .txt里面是密码

我的做法:

第一步,

1、下载jar包,下载地址 https://www.bouncycastle.org/download/bcprov-ext-jdk15on-154.jar
2、将下载好的bcprov-ext-jdk15on-154.jar复制到%JDK_HOME%\jre\lib\ext下 (这个JDK_HOME就是你安装jdk的目录,记不到了可以直接去环境变量里查看)
3、用文本编辑器打开%JDK_HOME%\jre\lib\security\java.security文件,在相应位置添加如下配置(这个可以搜索security.provider 前面已经有1-10,在后面添加即可)

security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider

第二步:

1、双击安装pfx格式证书,输入密码后,其他按默认方式进行下一步操作(过程中需要选择 允许导出私钥),直到完成。

2、开始-->运行,输入certmgr.msc,在个人-->证书中找到刚刚安装的证书文件,右键该证书,选择所有任务-->导出,导出的过程注意要勾选运行导出私钥,其他默认方式,密码设置要简单,如数字1(否则后面转换BKS证书的时候会提示非法私钥),直到完成。

第三步:

然后输入以下命令

keytool -importcert -v -trustcacerts -alias 位置1 \
-file 位置2 \
-keystore 位置3 -storetype BKS \
-providerclass org.bouncycastle.jce.provider.BouncyCastleProvider \
-providerpath 位置4 -storepass 位置5

位置1:是个随便取的别名 
位置2:cer或crt证书的全地址 
位置3:生成后bks文件的位置,建议写全地址 
位置4:上面下载JCE Provider包的位置 
位置5:生成后证书的密码

参考 :keytool -importcert -v -trustcacerts -alias xx -file E:\bks\xx.cer -keystore E:\bks\xx.bks -storetype BKS -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath E:\bks\bcprov-jdk15on-146.jar -storepass xxxxxx
 

第四步:

加入代码

public class SSLSocketFactoryUtils {

    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.mybks);
            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();
    }

    public final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };

}

把你生成好的xxx.bks 放到 res/raw下

再加入

这样基本就可以了

但是!遇到一个问题

java.io.IOException: Hostname 'xx.40.16.93' was not verified

查看log分析

然后查看服务器证书,发现其中的域名为

 CN=xxx.com

而我请求的域名为

xx.40.16.93

查网上方法解决这个问题有两个方法:

1.重新生成服务器的证书,用真实的域名信息。

2.在客户端代码中增加如下代码,忽略hostname 的验证。(仅仅用于测试阶段,不建议用于发布后的产品中。)

HttpsURLConnection.setDefaultHostnameVerifier( new HostnameVerifier(){
    public boolean verify(String string,SSLSession ssls) {
            return true;
        }
});

我才用的是后者方式

先再刚刚的SSLSocketFactoryUtils里添加上面的代码
然后加上这一段代码,就可以通过

然后等我们域名审核完成了过后再把这个去掉,并把请求域名地址换下就可以了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值