android https——okhttp实现https请求
2017-10-23 18:41
363 查看
定义:
HTTPS全称为Hypertext Transfer Protocol over Secure Socket Layer
中文含义为“超文本传输协议在安全加密字层”
简单来说就是加密数据传输和安全连接。https和http有什么区别
在HTTP的之下加入了SSL (Secure Socket Layer),安全的基础就靠SSL。
SSL位于TCP/IP和HTTP协议之间
https与http的区别:
●https更安全
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
●https需要申请证书
https协议需要到ca申请证书,一般免费证书很少,需要交费,费用大概与.COM域名差不多,每年需要交大约几十元的费用。而常见的http协议则没有这一项;
●端口不同
http使用的是大家最常见的80端口,而https连接使用的是443端口;
●状态不同
http的连接很简单,是无状态的。而HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全
google官方推荐的android网络请求框架okhttp已经集成了https的使用方法,我们只需要按照api去调用即可。
购买的证书,格式为.pfx,带有公钥和私钥,附带一个密码。还有一种格式为.cer的证书,这种证书是没有私钥的。
服务器会将证书配置到tomcat中,客户端则存放在本地,app启动的时候加载进去。
.pfx格式和.cer格式的区别:
1.带有私钥的证书
由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀名。
2.二进制编码的证书
证书中没有私钥,DER 编码二进制格式的证书文件,以cer作为证书文件后缀名。
3.Base64编码的证书
证书中没有私钥,BASE64 编码格式的证书文件,也是以cer作为证书文件后缀名。
更多具体区别:
.pfx格式和.cer格式的区别
在okhttp中配置ca证书:
将ca证书放在本地,这里我们使用.pfx格式的证书srca.pfx:
有两种写法,先展示一种接近okhttp官方写法的方法,官方api写法不够简洁
第二种写法,同样有效
值得注意的是,keystore的格式
所以,如果你的ca证书用的是.pfx,那么可以这样写:
如果是.cer的话那么,就用
假如:
客户端的加密文件叫:test1.jks
服务器的加密文件叫:test2.cer
如何通过jks文件生成对应的cer文件?
接下来利用test1.jks来签发证书,可以在android studio中,也可以在windows的dos中生成:
keytool -export -alias test1.jks
-file test2.cer
-keystore test1.jks
-storepass 123456
即可生成包含公钥的证书test2.cer。
首先配置tomcat服务器:
Connector标签,需要添加些属性:
注意:如果tomcat中报错keystore文件格式不正确,则我们再将cer文件转换成jks文件:
keytool -import -alias test2.cer
-file test2.cer -keystore test3.jks
配置客户端:
注意:
Java平台默认识别jks格式的证书文件,但是android平台只识别bks格式的证书文件,所以这里还需要将jks的文件转成bks
最后给出okhttp官方https的api方法
CustomTrust.java
HTTPS全称为Hypertext Transfer Protocol over Secure Socket Layer
中文含义为“超文本传输协议在安全加密字层”
简单来说就是加密数据传输和安全连接。https和http有什么区别
在HTTP的之下加入了SSL (Secure Socket Layer),安全的基础就靠SSL。
SSL位于TCP/IP和HTTP协议之间
https与http的区别:
●https更安全
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
●https需要申请证书
https协议需要到ca申请证书,一般免费证书很少,需要交费,费用大概与.COM域名差不多,每年需要交大约几十元的费用。而常见的http协议则没有这一项;
●端口不同
http使用的是大家最常见的80端口,而https连接使用的是443端口;
●状态不同
http的连接很简单,是无状态的。而HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全
google官方推荐的android网络请求框架okhttp已经集成了https的使用方法,我们只需要按照api去调用即可。
使用okhttp实现https请求
首先要搞清楚https的请求需要什么,可以从上面描述中看出,我们需要一份ca证书。购买的证书,格式为.pfx,带有公钥和私钥,附带一个密码。还有一种格式为.cer的证书,这种证书是没有私钥的。
服务器会将证书配置到tomcat中,客户端则存放在本地,app启动的时候加载进去。
.pfx格式和.cer格式的区别:
1.带有私钥的证书
由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀名。
2.二进制编码的证书
证书中没有私钥,DER 编码二进制格式的证书文件,以cer作为证书文件后缀名。
3.Base64编码的证书
证书中没有私钥,BASE64 编码格式的证书文件,也是以cer作为证书文件后缀名。
更多具体区别:
.pfx格式和.cer格式的区别
在okhttp中配置ca证书:
将ca证书放在本地,这里我们使用.pfx格式的证书srca.pfx:
单向验证
虽然我使用的是二次封装okhttp的retrofit,但是这个配置还是属于okhttp的。有两种写法,先展示一种接近okhttp官方写法的方法,官方api写法不够简洁
/** * 设置ihttps证书验证 */ private void setCertificates(Context context) { try { //将ca证书导入输入流 InputStream inputStream = context.getResources().openRawResource(R.raw.aaa); //keystore添加证书内容和密码 KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(inputStream, CLIENT_KET_PASSWORD.toCharArray()); //证书工厂类,生成证书 CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); //生成证书,添加别名 keyStore.setCertificateEntry("test1", certificateFactory.generateCertificate(inputStream)); //信任管理器工厂 TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(keyStore); //构建一个ssl上下文,加入ca证书格式,与后台保持一致 SSLContext sslContext = SSLContext.getInstance("TLS"); //参数,添加受信任证书和生成随机数 sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom()); //获得scoket工厂 SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); mOkHttpClient.sslSocketFactory(sslSocketFactory); //设置ip授权认证:如果已经安装该证书,可以不设置,否则需要设置 mOkHttpClient.hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }); inputStream.close(); } catch (Exception e) { e.printStackTrace(); } }
第二种写法,同样有效
/** * 设置ihttps证书验证 */ private void setCertificates(Context context) { try { //将ca证书导入输入流 InputStream inputStream = context.getResources().openRawResource(R.raw.aaa); //keystore添加证书内容和密码 KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(inputStream, CLIENT_KET_PASSWORD.toCharArray()) //key管理器工厂 KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); keyManagerFactory.init(keyStore, CLIENT_KET_PASSWORD.toCharArray()); //构建一个ssl上下文,加入ca证书格式,与后台保持一致 SSLContext sslContext = SSLContext.getInstance("TLS"); //参数,添加受信任证书和生成随机数 sslContext.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom()); //获得scoket工厂 SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); mOkHttpClient.sslSocketFactory(sslSocketFactory); //设置ip授权认证:如果已经安装该证书,可以不设置,否则需要设置 mOkHttpClient.hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }); inputStream.close(); } catch (Exception e) { e.printStackTrace(); } }
值得注意的是,keystore的格式
keystore拓展名对应格式: //JKS:.jks/.ks //JCEKS:.jce //PKCS12:.p12/.pfx //BKS:.bks //UBER:.ubr
所以,如果你的ca证书用的是.pfx,那么可以这样写:
KeyStore keyStore = KeyStore.getInstance("PKCS12");
如果是.cer的话那么,就用
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
双向验证
双向验证的前提是,你的app同样生成一个jks的密钥文件,服务器那边会同时有个“cer文件”与之对应。假如:
客户端的加密文件叫:test1.jks
服务器的加密文件叫:test2.cer
如何通过jks文件生成对应的cer文件?
接下来利用test1.jks来签发证书,可以在android studio中,也可以在windows的dos中生成:
keytool -export -alias test1.jks
-file test2.cer
-keystore test1.jks
-storepass 123456
即可生成包含公钥的证书test2.cer。
首先配置tomcat服务器:
Connector标签,需要添加些属性:
<Connector SSLEnabled="true" acceptCount="100" clientAuth="false" disableUploadTimeout="true" enableLookups="true" keystoreFile="" keystorePass="123456" maxSpareThreads="75" maxThreads="200" minSpareThreads="5" port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https" secure="true" sslProtocol="TLS" <!-- 以上代码是服务器配置https的tomcat配置, 以下是在https单向验证的基础上的双向验证--> clientAuth="true" truststoreFile="/Users/zhy/temp/test2.cer" />
注意:如果tomcat中报错keystore文件格式不正确,则我们再将cer文件转换成jks文件:
keytool -import -alias test2.cer
-file test2.cer -keystore test3.jks
配置客户端:
/** * 设置ihttps证书验证 */ private void setCertificates(Context context) { try { //将ca证书导入输入流 InputStream inputStream = context.getResources().openRawResource(R.raw.aaa); //keystore添加证书内容和密码 KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(inputStream, CLIENT_KET_PASSWORD.toCharArray()); //证书工厂类,生成证书 CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); //生成证书,添加别名 keyStore.setCertificateEntry("test1", certificateFactory.generateCertificate(inputStream)); //信任管理器工厂 TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(keyStore); //双向验证,配置服务器验证客户端的证书 InputStream inputStream1 = context.getResources().openRawResource(R.raw.bbb); KeyStore keyStore1 = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore1.load(inputStream1, CLIENT_KET_PASSWORD_1.toCharArray()); KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); keyManagerFactory.init(keyStore1, CLIENT_KET_PASSWORD_1.toCharArray()); //构建一个ssl上下文,加入ca证书格式,与后台保持一致 SSLContext sslContext = SSLContext.getInstance("TLS"); //参数,添加受信任证书和生成随机数 sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom()); //获得scoket工厂 SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); mOkHttpClient.sslSocketFactory(sslSocketFactory); //设置ip授权认证:如果已经安装该证书,可以不设置,否则需要设置 mOkHttpClient.hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }); inputStream.close(); } catch (Exception e) { e.printStackTrace(); } }
注意:
Java平台默认识别jks格式的证书文件,但是android平台只识别bks格式的证书文件,所以这里还需要将jks的文件转成bks
最后给出okhttp官方https的api方法
CustomTrust.java
相关文章推荐
- kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式
- kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式
- Android-OKhttp解决https安全链接请求问题
- Android HTTPS 自制证书实现双向认证(OkHttp + Retrofit + Rxjava)
- kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式
- Android HTTPS 自制证书实现双向认证(OkHttp + Retrofit + Rxjava)
- Android中原http请求的https实现(URLConnection 、volley)(volley不修改源码)
- Android模拟 HTTP multipart/form-data 请求协议信息实现图片上传
- JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求
- Android 实现 HttpClient 请求Https
- 在 Android 上通过模拟 HTTP multipart/form-data 请求协议信息实现图片上传
- 使用burpsuite监控设备(如ios,android)网络http,https请求
- Android模拟 HTTP multipart/form-data 请求协议信息实现图片上传
- Android HTTP实例 使用GET方法和POST方法发送请求(通过Apache接口实现)
- Android版Web服务器实现(一)HTTP协议请求头解析
- JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求
- Android客户端请求服务端资源(HttpURLConnection和输入流实现)
- 在 Android 上通过模拟 HTTP multipart/form-data 请求协议信息实现图片上传
- 在Android上通过模拟HTTP multipart/form-data请求协议信息实现图片上传
- Android 下使用 JSON 实现 HTTP 请求