今天我们正式环境需要换成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里添加上面的代码
然后加上这一段代码,就可以通过
然后等我们域名审核完成了过后再把这个去掉,并把请求域名地址换下就可以了