Android进阶(三)android httpClient 支持HTTPS的访问方式

         e.printStackTrace(); 
         return new DefaultHttpClient(params); 
     } 
 } 
 return client; 

}

public static class SSLSocketFactoryImp extends SSLSocketFactory {
final SSLContext sslContext = SSLContext.getInstance(“TLS”);

 public SSLSocketFactoryImp(KeyStore truststore) 
         throws NoSuchAlgorithmException, KeyManagementException, 
         KeyStoreException, UnrecoverableKeyException { 
     super(truststore); 

     TrustManager tm = new X509TrustManager() { 
         public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
             return null; 
         } 

         @Override 
         public void checkClientTrusted( 
                 java.security.cert.X509Certificate[] chain, 
                 String authType) 
                 throws java.security.cert.CertificateException { 
         } 

         @Override 
         public void checkServerTrusted( 
                 java.security.cert.X509Certificate[] chain, 
                 String authType) 
                 throws java.security.cert.CertificateException { 
         } 
     }; 
     sslContext.init(null, new TrustManager[] { tm }, null); 
 } 

 @Override 
 public Socket createSocket(Socket socket, String host, int port, 
         boolean autoClose) throws IOException, UnknownHostException { 
     return sslContext.getSocketFactory().createSocket(socket, host, 
             port, autoClose); 
 } 

 @Override 
 public Socket createSocket() throws IOException { 
     return sslContext.getSocketFactory().createSocket(); 
 } 

}


 


 


 


run下,小手发抖的点到测试按钮,深吸口气,咦?没反应。。。马蛋的,工作线程忘记start(),唉,再次run下,终于的有点反应了,神奇的竟然没有报之前的 javax.net.ssl.SSLPeerUnverifiedException: No peer certificate 的异常了。服务端的数据正常返回了。


 


分析问题:


HTTPS:超文本安全传输协议,和HTTP相比,多了一个SSL/TSL的认证过程,端口为443。


 


1.peer终端发送一个request,https服务端把支持的加密算法等以证书的形式返回一个身份信息(包含ca颁发机构和加密公钥等)。


 


2.获取证书之后,验证证书合法性。


 


3.随机产生一个密钥,并以证书当中的公钥加密。


 


4.request https服务端,把用公钥加密过的密钥传送给https服务端。


 


5.https服务端用自己的密钥解密,获取随机值。


 


6.之后双方传送数据都用此密钥加密后通信。


 


HTTPS流程清楚后,问题也就明显了,验证证书时,无法验证。


 


上面提供的解决方案就是添加默认信任全部证书。以此来通过接下来的通信。


 


但是,这样问题是解决了。但是觉得还是不带靠谱(信任全部证书有点危险)。继续噼噼啪啪的网上搜索一番。又找到了一种解决方案,其过程大致这样的:


 


1.浏览器访问https地址,保存提示的证书到本地,放到android项目中的assets目录。


 


2.导入证书,代码如下。


 


3.把证书添加为信任。


 


 



public static String requestHTTPSPage(Context context, String mUrl) {
InputStream ins = null;
String result = “”;
try {
ins = context.getAssets().open(“my.key”); // 下载的证书放到项目中的assets目录中
CertificateFactory cerFactory = CertificateFactory.getInstance(“X.509”);
Certificate cer = cerFactory.generateCertificate(ins);
KeyStore keyStore = KeyStore.getInstance(“PKCS12”, “BC”);
keyStore.load(null, null);
keyStore.setCertificateEntry(“trust”, cer);

        SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore); 
        Scheme sch = new Scheme("https", socketFactory, 443); 
        HttpClient mHttpClient = new DefaultHttpClient(); 
        mHttpClient.getConnectionManager().getSchemeRegistry().register(sch); 

        BufferedReader reader = null; 
        try { 
            HttpGet request = new HttpGet(); 
            request.setURI(new URI(mUrl)); 
            HttpResponse response = mHttpClient.execute(request); 
            if (response.getStatusLine().getStatusCode() != 200) { 
                request.abort(); 
                return result; 
            } 

            reader = new BufferedReader(new InputStreamReader(response 
                    .getEntity().getContent())); 
            StringBuffer buffer = new StringBuffer(); 
            String line = null; 
            while ((line = reader.readLine()) != null) { 
                buffer.append(line); 
            } 
            result = buffer.toString(); 

结尾

学习html5、css、javascript这些基础知识,学习的渠道很多,就不多说了,例如,一些其他的优秀博客。但是本人觉得看书也很必要,可以节省很多时间,常见的javascript的书,例如:javascript的高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。

html5

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值