Android https通信问题
来源:互联网 发布:江苏省大数据管理中心 编辑:程序博客网 时间:2024/05/18 16:57
1、信任所有的证书:
Android平台上经常有使用https的需求,对于https服务器使用的根证书是受信任的证书的话,实现https是非常简单的,直接用httpclient库就行了,与使用http几乎没有区别。但是在大多数情况下,服务器所使用的根证书是自签名的,或者签名机构不在设备的信任证书列表中,这样使用httpclient进行https连接就会失败。解决这个问题的办法有两种,一是在发起https连接之前将服务器证书加到httpclient的信任证书列表中,这个相对来说比较复杂一些,很容易出错;另一种办法是让httpclient信任所有的服务器证书,这种办法相对来说简单很多,但安全性则差一些,但在某些场合下有一定的应用场景。这一篇主要实现httpclient信任所有的服务器证书。
直接给出代码:
package com.example.zq.test3;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.widget.TextView;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.URL;import java.security.SecureRandom;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.HostnameVerifier;import javax.net.ssl.HttpsURLConnection;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSession;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;import cn.edu.zafu.bmobdemo.R;/** * Created by stevenzhang on 2017/2/21 0021. */public class HttpsTestActivity extends Activity { /** Called when the activity is first created. */ private TextView text; public static final String TAG = "HttpsTestActivity"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); text=(TextView)findViewById(R.id.textView1); GetHttps(); } private void GetHttps(){ final String https = "https://www.google.com.hk";//google可能访问不了,可以换一个https链接 new Thread(new Runnable() { @Override public void run() { try{ SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, new TrustManager[]{new MyTrustManager()}, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); HttpsURLConnection.setDefaultHostnameVerifier(new MyHostnameVerifier()); HttpsURLConnection conn = (HttpsURLConnection)new URL(https).openConnection(); conn.setDoOutput(true); conn.setDoInput(true); conn.connect(); BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); final StringBuffer sb = new StringBuffer(); String line; while ((line = br.readLine()) != null) sb.append(line); runOnUiThread(new Runnable() { @Override public void run() { text.setText(sb.toString()); } }); }catch(Exception e){ Log.e(TAG, e.toString()); } } }).start(); // runOnUiThread(new Runnable() {// @Override// public void run() {// // }// }); } private class MyHostnameVerifier implements HostnameVerifier { @Override public boolean verify(String hostname, SSLSession session) { // TODO Auto-generated method stub return true; } } private class MyTrustManager implements X509TrustManager { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { // TODO Auto-generated method stub } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { // TODO Auto-generated method stub } @Override public X509Certificate[] getAcceptedIssuers() { // TODO Auto-generated method stub return null; } }}
使用HttpsURLConnection时需要实现HostnameVerifier 和 X509TrustManager,这两个实现是必须的,要不会报安全验证异常。
0 0
- Android https通信问题
- Android Https通信
- android使用https通信总结
- Android通信安全之HTTPS
- Android 用Https协议与服务器通信
- android https通信跟服务器配置说明
- Android系统中HTTPS通信的实现
- Android App 安全的HTTPS 通信
- android中https通信的学习
- Android与服务端使用Https加密通信
- https通信
- Android WebView https请求问题。
- Android https 自定义 证书 问题
- android应用安全——通信安全(android https)
- android应用安全——通信安全(android https)
- android应用安全——通信安全(android https)
- android socket通信问题
- android UDP通信问题
- Zookeeper序列化及通信协议
- px、pt、ppi、dpi、dp、sp之间的关系
- HPUOJ---2017寒假作业--专题-1/K-Pseudoprime numbers(伪素数)
- Java虚拟机详解01----初识JVM
- LeetCode 390. Elimination Game
- Android https通信问题
- html标签title属性值包括<br/>处理
- https refused 解决方法
- POJ 3332 Parsing Real Numbers 可能会
- 算法提高 9-1九宫格
- 类对象作为函数参数
- Linux下sendmail的设置,修改发信domain的方法
- Java虚拟机详解02----JVM内存结构
- 解决Error:Android Dex: com.android.dex.DexIndexOverflowException: Cannot merge new index 65918 into a