Android HTTPS验证和添加http头信息token认证

本文涉及的产品
Digicert DV 单域名(免费证书),20个 3个月
简介:


 实现https信任所有证书的方法

Android平台上经常有使用https的需求,对于https服务器使用的根证书是受信任的证书的话,实现https是非常简单的,直接用httpclient库就行了,与使用http几乎没有区别。但是在大多数情况下,服务器所使用的根证书是自签名的,或者签名机构不在设备的信任证书列表中,这样使用httpclient进行https连接就会失败。解决这个问题的办法有两种,一是在发起https连接之前将服务器证书加到httpclient的信任证书列表中,这个相对来说比较复杂一些,很容易出错;另一种办法是让httpclient信任所有的服务器证书,这种办法相对来说简单很多,但安全性则差一些,但在某些场合下有一定的应用场景。这里要举例说明的就是后一种方法:实例化HttpClinet对象时要进行一些处理主要是绑定https连接所使用的端口号,这里绑定了443和8443:

[java]  view plain copy
  1. SchemeRegistry schemeRegistry = new SchemeRegistry();  
  2. schemeRegistry.register(new Scheme("https",  
  3.                     new EasySSLSocketFactory(), 443));  
  4. schemeRegistry.register(new Scheme("https",  
  5.                     new EasySSLSocketFactory(), 8443));  
  6. ClientConnectionManager connManager = new ThreadSafeClientConnManager(params, schemeRegistry);  
  7. HttpClient httpClient = new DefaultHttpClient(connManager, params);  


上面的EasySSLSocketFactory类是我们自定义的,主要目的就是让httpclient接受所有的服务器证书,能够正常的进行https数据读取。相关代码如下:

[java]  view plain copy
  1. public class EasySSLSocketFactory implements SocketFactory,  
  2.         LayeredSocketFactory {  
  3.   
  4.     private SSLContext sslcontext = null;  
  5.   
  6.     private static SSLContext createEasySSLContext() throws IOException {  
  7.         try {  
  8.             SSLContext context = SSLContext.getInstance("TLS");  
  9.             context.init(nullnew TrustManager[] { new EasyX509TrustManager(  
  10.                     null) }, null);  
  11.             return context;  
  12.         } catch (Exception e) {  
  13.             throw new IOException(e.getMessage());  
  14.         }  
  15.     }  
  16.   
  17.     private SSLContext getSSLContext() throws IOException {  
  18.         if (this.sslcontext == null) {  
  19.             this.sslcontext = createEasySSLContext();  
  20.         }  
  21.         return this.sslcontext;  
  22.     }  
  23.   
  24.      
  25.     public Socket connectSocket(Socket sock, String host, int port,  
  26.             InetAddress localAddress, int localPort, HttpParams params)  
  27.             throws IOException, UnknownHostException, ConnectTimeoutException {  
  28.         int connTimeout = HttpConnectionParams.getConnectionTimeout(params);  
  29.         int soTimeout = HttpConnectionParams.getSoTimeout(params);  
  30.   
  31.         InetSocketAddress remoteAddress = new InetSocketAddress(host, port);  
  32.         SSLSocket sslsock = (SSLSocket) ((sock != null) ? sock : createSocket());  
  33.   
  34.         if ((localAddress != null) || (localPort > 0)) {  
  35.             // we need to bind explicitly  
  36.             if (localPort < 0) {  
  37.                 localPort = 0// indicates "any"  
  38.             }  
  39.             InetSocketAddress isa = new InetSocketAddress(localAddress,  
  40.                     localPort);  
  41.             sslsock.bind(isa);  
  42.         }  
  43.   
  44.         sslsock.connect(remoteAddress, connTimeout);  
  45.         sslsock.setSoTimeout(soTimeout);  
  46.         return sslsock;  
  47.   
  48.     }  
  49.   
  50.      
  51.     public Socket createSocket() throws IOException {  
  52.         return getSSLContext().getSocketFactory().createSocket();  
  53.     }  
  54.   
  55.      
  56.     public boolean isSecure(Socket socket) throws IllegalArgumentException {  
  57.         return true;  
  58.     }  
  59.   
  60.      
  61.     public Socket createSocket(Socket socket, String host, int port,  
  62.             boolean autoClose) throws IOException, UnknownHostException {  
  63.         return getSSLContext().getSocketFactory().createSocket(socket, host,  
  64.                 port, autoClose);  
  65.     }  
  66.   
  67.     // -------------------------------------------------------------------  
  68.     // javadoc in org.apache.http.conn.scheme.SocketFactory says :  
  69.     // Both Object.equals() and Object.hashCode() must be overridden  
  70.     // for the correct operation of some connection managers  
  71.     // -------------------------------------------------------------------  
  72.   
  73.     public boolean equals(Object obj) {  
  74.         return ((obj != null) && obj.getClass().equals(  
  75.                 EasySSLSocketFactory.class));  
  76.     }  
  77.   
  78.     public int hashCode() {  
  79.         return EasySSLSocketFactory.class.hashCode();  
  80.     }  
  81. }  
  82.   
  83. public class EasyX509TrustManager implements X509TrustManager {  
  84.   
  85.     private X509TrustManager standardTrustManager = null;  
  86.   
  87.      
  88.     public EasyX509TrustManager(KeyStore keystore)  
  89.             throws NoSuchAlgorithmException, KeyStoreException {  
  90.         super();  
  91.         TrustManagerFactory factory = TrustManagerFactory  
  92.                .getInstance(TrustManagerFactory.getDefaultAlgorithm());  
  93.         factory.init(keystore);  
  94.         TrustManager[] trustmanagers = factory.getTrustManagers();  
  95.         if (trustmanagers.length == 0) {  
  96.             throw new NoSuchAlgorithmException("no trust manager found");  
  97.         }  
  98.         this.standardTrustManager = (X509TrustManager) trustmanagers[0];  
  99.     }  
  100.   
  101.      
  102.     public void checkClientTrusted(X509Certificate[] certificates,  
  103.             String authType) throws CertificateException {  
  104.         standardTrustManager.checkClientTrusted(certificates, authType);  
  105.     }  
  106.   
  107.      
  108.     public void checkServerTrusted(X509Certificate[] certificates,  
  109.             String authType) throws CertificateException {  
  110.         if ((certificates != null) && (certificates.length == 1)) {  
  111.             certificates[0].checkValidity();  
  112.         } else {  
  113.             standardTrustManager.checkServerTrusted(certificates, authType);  
  114.         }  
  115.     }  
  116.   
  117.      
  118.     public X509Certificate[] getAcceptedIssuers() {  
  119.         return this.standardTrustManager.getAcceptedIssuers();  
  120.     }  
  121. }  


[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. SchemeRegistry schemeRegistry = new SchemeRegistry();  
  2.         schemeRegistry.register(new Scheme("http", PlainSocketFactory  
  3.                 .getSocketFactory(), 80));  
  4.   
  5.         SSLSocketFactory sf = SSLSocketFactory.getSocketFactory();  
  6.         try {  
  7.             KeyStore trustStore = KeyStore.getInstance(KeyStore  
  8.                     .getDefaultType());  
  9.             trustStore.load(nullnull);  
  10.             sf = new SSLSocketFactoryEx(trustStore);  
  11.             sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);  
  12.             // 允许所有主机的验证  
  13.         } catch (Exception e) {  
  14.             Log.e("erro""SSLSocketFactory Error");  
  15.         }  
  16.   
  17.         schemeRegistry.register(new Scheme("https", sf, 443));  
  18.         ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(  
  19.                 httpParams, schemeRegistry);  
  20. DefaultHttpClient httpClient = new DefaultHttpClient(cm, httpParams);  


上面的 SSLSocketFactoryEx 类主要目的就是让httpclient接受所有的服务器证书,能够正常的进行https数据读取。相关代码如下:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. class SSLSocketFactoryEx extends SSLSocketFactory {  
  2.   
  3.         SSLContext sslContext = SSLContext.getInstance("TLS");  
  4.   
  5.         public SSLSocketFactoryEx(KeyStore truststore)  
  6.                 throws NoSuchAlgorithmException, KeyManagementException,  
  7.                 KeyStoreException, UnrecoverableKeyException {  
  8.             super(truststore);  
  9.   
  10.             TrustManager tm = new X509TrustManager() {  
  11.   
  12.                 @Override  
  13.                 public java.security.cert.X509Certificate[] getAcceptedIssuers() {  
  14.                     return null;  
  15.                 }  
  16.   
  17.                 @Override  
  18.                 public void checkClientTrusted(  
  19.                         java.security.cert.X509Certificate[] chain,  
  20.                         String authType)  
  21.                         throws java.security.cert.CertificateException {  
  22.   
  23.                 }  
  24.   
  25.                 @Override  
  26.                 public void checkServerTrusted(  
  27.                         java.security.cert.X509Certificate[] chain,  
  28.                         String authType)  
  29.                         throws java.security.cert.CertificateException {  
  30.   
  31.                 }  
  32.             };  
  33.   
  34.             sslContext.init(nullnew TrustManager[] { tm }, null);  
  35.         }  
  36.   
  37.         @Override  
  38.         public Socket createSocket(Socket socket, String host, int port,  
  39.                 boolean autoClose) throws IOException, UnknownHostException {  
  40.             return sslContext.getSocketFactory().createSocket(socket, host,  
  41.                     port, autoClose);  
  42.         }  
  43.   
  44.         @Override  
  45.         public Socket createSocket() throws IOException {  
  46.             return sslContext.getSocketFactory().createSocket();  
  47.         }  
  48.     }  

添加http头信息token认证

有时候服务器端需要传递token来验证请求来源是否是受信任的,以增强安全性:

httppost.addHeader("Authorization", "your token"); //token认证
重点是有些服务器要求将token转化成Base64编码。

于是  String token ="Basic " + Base64.encodeToString("your token".getBytes(), Base64.NO_WRAP);

注意,参数是 Base64.NO_WRAP而不是Base64.DEFAULT 。而否则会返回 “400 Bad Request”,而得不到数据。


相关文章
|
2月前
|
XML JSON API
识别这些API接口定义(http,https,api,RPC,webservice,Restful api ,OpenAPI)
本内容介绍了API相关的术语分类,包括传输协议(HTTP/HTTPS)、接口风格(RESTful、WebService、RPC)及开放程度(API、OpenAPI),帮助理解各类API的特点与应用场景。
|
2月前
|
Android开发 Kotlin
|
4月前
|
安全 网络安全 数据安全/隐私保护
网页安全演进:HTTP、HTTPS与HSTS
这整个进程实质上是网页安全由“裸奔”到“穿衣”再到“绑带”的演变史。它保障了数据的机密性和完整性,降低了中间人攻击的风险,最终实现了更自由、更安全的网络环境。但别忘了,技术永远在发展,网络安全的赛跑也永无终点。*ENDPOINT*
298 11
|
5月前
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
156 18
|
5月前
|
域名解析 网络协议 网络安全
SSL证书验证全攻略:DNS/HTTP/手动解析怎么选?
SSL证书在网络安全中至关重要,1Panel提供三种验证方式:DNS验证、HTTP验证和手动解析。DNS验证便捷,适合CDN网站;HTTP验证快速,需服务器在线;手动解析灵活,但操作复杂。根据需求选择合适确认方式,定期检查证书状态。
657 2
|
5月前
|
JSON 安全 网络协议
HTTP/HTTPS协议(请求响应模型、状态码)
本文简要介绍了HTTP与HTTPS协议的基础知识。HTTP是一种无状态的超文本传输协议,基于TCP/IP,常用80端口,通过请求-响应模型实现客户端与服务器间的通信;HTTPS为HTTP的安全版本,基于SSL/TLS加密技术,使用443端口,确保数据传输的安全性。文中还详细描述了HTTP请求方法(如GET、POST)、请求与响应头字段、状态码分类及意义,并对比了两者在请求-响应模型中的安全性差异。
449 20
|
5月前
|
安全 网络协议 算法
HTTP/HTTPS与SOCKS5协议在隧道代理中的兼容性设计解析
本文系统探讨了构建企业级双协议隧道代理系统的挑战与实现。首先对比HTTP/HTTPS和SOCKS5协议特性,分析其在工作模型、连接管理和加密方式上的差异。接着提出兼容性架构设计,包括双协议接入层与统一隧道内核,通过协议识别模块和分层设计实现高效转换。关键技术部分深入解析协议转换引擎、连接管理策略及加密传输方案,并从性能优化、安全增强到典型应用场景全面展开。最后指出未来发展趋势将更高效、安全与智能。
194 1
|
11月前
|
前端开发 JavaScript 安全
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第27天】本文介绍了HTTP/2和HTTPS在前端性能调优中的应用。通过多路复用、服务器推送和头部压缩等特性,HTTP/2显著提升了Web性能。同时,HTTPS确保了数据传输的安全性。文章提供了示例代码,展示了如何使用Node.js创建一个HTTP/2服务器。
304 3
|
6月前
|
安全 网络安全 数据安全/隐私保护
HTTP 与 HTTPS 协议及 SSL 证书解析-http和https到底有什么区别?-优雅草卓伊凡
HTTP 与 HTTPS 协议及 SSL 证书解析-http和https到底有什么区别?-优雅草卓伊凡
314 3
|
8月前
|
网络协议 安全 网络安全
HTTP与HTTPS协议入门
HTTP协议是互联网的基石,HTTPS则是其安全版本。HTTP基于TCP/IP协议,属于应用层协议,不涉及数据包传输细节,主要规定客户端与服务器的通信格式,默认端口为80。
261 25
HTTP与HTTPS协议入门

热门文章

最新文章