`
scliu0718
  • 浏览: 52794 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

Android之HttpsURLConnection访问网络(android https协议)

 
阅读更多
android 基于https协议(HttpsURLConnection)的网络访问:

由于HttpsURLConnection是HttpURLConnection的子类,在这里就不多作介绍了,
如果需要,可直接把下面的HttpURLConnection改成HttpsURLConnection即可(当前
项目中是http、https都可以访问,所以采用的是HttpURLConnection)
在这里值得注意的是:
1.本人没用研究过X509HostnameVerifier这个接口,就直接重写了X509HostnameVerifier这个接口,
把它唯一的方法写为空,直接return ture;结果一直抛:CertificationException: Trust anchor
for certification path not found,根据字面意思是指数字签名证书找不到,后来无意中在网上
看到一句这样的代码(当然这安全性低):
X509HostnameVerifier hostnameVerifier = SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;

设置签名证书为所有主机验证通过,然后再设置下面:
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
最后此异常它不抛了。。。。嘿嘿,由此我猜:这个东西可能是指对安全验证的过滤(也可说的安全
级别的设置)

2.在android中,目前只支持数字签名证书为BKS的格式,如果其它格式的话需要转换,转换就不说了,
网上一大堆。如果有异常为:KeyStore JKSimplementation not found的话一般就是这个原因了。

3.通过SSLContext.getInstance("TLS")来获取SSL上下文,这个有些不太明白为什么"SSL"和"TLS"有
什么区别,谁知道的话告诉我一下.


public class NetHelper {


public static final String DOMAIN_LIST = "RestService/User/DomainList";

X509HostnameVerifier hostnameVerifier = SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
SSLContext sslContext = null;
InputStream in = null;


public NetHelper() {
try {
MyX509TrustManager mtm = new MyX509TrustManager();
TrustManager[] tms = new TrustManager[] { mtm };

// 初始化X509TrustManager中的SSLContext
sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tms, new java.security.SecureRandom());
} catch (Exception e) {
e.printStackTrace();
}

// 为javax.net.ssl.HttpsURLConnection设置默认的SocketFactory和HostnameVerifier
if (sslContext != null) {
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext
.getSocketFactory());
}
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
}


/*
* 取Domain
*/
public InputStream getDomainList(String path) throws Exception {
String uri = path + DOMAIN_LIST;
Log.i("sys", uri);
URL url = new URL(uri);

HttpURLConnection conn = null;//也可用HttpsURLConnection,但将不可进行http访问

//if(uri.contains("https")){

// conn = (HttpsURLConnection) url.openConnection();

//}else

conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");
conn.setDoOutput(true);
conn.setDoInput(true);
// 设置连接超时时间
conn.setConnectTimeout(4 * 1000);
conn.setRequestProperty("Content-Type", "text/xml");
conn.connect();
in = conn.getInputStream();
return in;
}
}

还需自定义X509TrustManager:
注:通过实现X509TrustManager来定义了证书管理器,对服务器和客户端进行验证方法,
把所有的方法写成空(如果有的话则需要验证),还需要定义我们的KeyStore来源数字
签名证书文件)。然后初始化证书管理工厂,并调用getTrustManagers()方法来获取这个
管理器

public class MyX509TrustManager implements X509TrustManager {
X509TrustManager myJSSEX509TrustManager;
public MyX509TrustManager() throws Exception {
KeyStore ks = KeyStore.getInstance("BKS");
// ks.load(new FileInputStream("trustedCerts"),
// "passphrase".toCharArray()); //----> 这是加载自己的数字签名证书文件和密码,在这里这里没有,所以不需要
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(ks);
TrustManager tms[] = tmf.getTrustManagers();
for (int i = 0; i < tms.length; i++) {
if (tms[i] instanceof X509TrustManager) {
myJSSEX509TrustManager = (X509TrustManager) tms[i];
return;
}
}
}
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
// sunJSSEX509TrustManager.checkClientTrusted(arg0, arg1);
}


@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
// sunJSSEX509TrustManager.checkServerTrusted(arg0, arg1);
}


@Override
public X509Certificate[] getAcceptedIssuers() {
// X509Certificate[] acceptedIssuers = sunJSSEX509TrustManager
// .getAcceptedIssuers();
// return acceptedIssuers;
return null;
}


}

先记到这里,以后发现错误再改,留给自己以后懂了再来看看改



分享到:
评论

相关推荐

    android 使用HttpsURLConnection方式的SSL双向认证

    在Android开发中,HTTPS协议是用于安全数据传输的标准,而SSL(Secure Sockets Layer)双向认证则进一步增强了安全性。此项目“android 使用HttpsURLConnection方式的SSL双向认证”着重讲解了如何在Android应用中...

    Android使用HttpClient和HttpsUrlConnection两种方式访问https网站

    在Android开发中,与服务器进行通信是不可或缺的一部分,特别是对于HTTPS协议,它为网络通信提供了安全性和隐私保护。本文将详细介绍如何使用`HttpClient`和`HttpsURLConnection`两种方式来访问HTTPS网站,包括验证...

    简单的android访问https

    总的来说,Android访问HTTPS涉及到网络通信的安全策略、证书验证、SSL/TLS协议的使用,以及可能的网络配置和第三方库的选择。理解这些知识点对于开发安全、可靠的Android应用至关重要。在实际开发过程中,应遵循最佳...

    android网络开发原理

    HttpURLConnection是Android API提供的另一种网络访问方式,它是基于HTTP协议的,适合于发送HTTP请求和接收响应。相比于早期的HttpClient库,HttpURLConnection具有更好的性能和可维护性,支持HTTP/2协议,并且更...

    HttpClient和HttpsUrlConnection

    在Android开发中,访问Web服务是常见的需求,尤其是与服务器进行数据交互时。HttpClient和HttpsUrlConnection是Android系统中用于实现HTTP和HTTPS请求的两个主要工具。本文将深入探讨这两种方式,以及它们在处理...

    Android通过https协议与服务器端进行通信

    在 Android 中,使用 HTTPS 协议与服务器端进行通信需要使用 HttpsURLConnection 类,该类提供了与 HTTPS 服务器的连接和数据交换功能。为了使用 HttpsURLConnection 类,需要实现两个必须的接口:HostnameVerifier ...

    AndroidHttps服务器端和客户端简单实例

    在Android开发中,HTTPS协议常用于确保数据传输的安全性,防止数据被窃取或篡改。本实例将探讨如何在Android环境下实现HTTPS服务器端和客户端的简单交互,支持单向和双向验证。以下是对实现这一功能所需的知识点的...

    Android TLS1.2双向认证demo

    4. **建立安全连接**:在Android应用中,使用`HttpsURLConnection`或者第三方库如OkHttp,设置SSLContext并启用自定义的TrustManager和X509TrustManager,这些管理器会信任我们提供的证书。然后,通过调用`connect()...

    Android基础 网络通信

    在AndroidManifest.xml文件中添加`&lt;uses-permission android:name="android.permission.INTERNET" /&gt;`以允许应用访问网络。 3. **使用HttpURLConnection进行网络通信**: - 创建连接:`HttpURLConnection ...

    Https请求工具类,Java实现http请求,https请求

    HttpsURLConnection conn = null; OutputStream out = null; String rsp = null; try { try{ //https 验证 TrustManager[] tm = { new MyX509TrustManager() }; SSLContext ctx = SSLContext.getInstance(...

    android通信机制所有demo打包(socket,http,ssl)

    6. **权限管理**:在Android系统中,网络访问需要添加相应的权限声明,如`&lt;uses-permission android:name="android.permission.INTERNET" /&gt;`,否则应用将无法进行网络通信。 7. **SSL/TLS原理**:SSL/TLS协议主要...

    android网络编程之http发送/请求服务

    然而,自Android 6.0(API级别23)起,`org.apache.http`已被弃用,推荐使用`java.net.URL`、`java.net.HttpURLConnection`或`android.net.http.HttpsURLConnection`进行网络请求。 一、HTTP请求的基本流程: 1. ...

    https的demo

    在Android开发中,HTTPS是一种广泛使用的安全通信协议,它能够确保客户端(比如手机应用)与服务器之间的通信数据不被窃取或篡改。本Demo旨在帮助初学者掌握如何在Android应用中实现HTTPS通信,以便安全地访问后台...

    https网络请求

    1. **URLConnection**:这是Java标准库提供的基础网络访问API。在处理HTTPS请求时,需要设置`URL.openConnection()`返回的`HttpURLConnection`对象的`setSSLSocketFactory()`方法,通常还需要信任所有证书,避免证书...

    跳过Https认证

    在这种场景下,为了调试或临时解决访问问题,开发者可能会选择跳过HTTPS的安全认证,也就是SSL(Secure Socket Layer)验证。然而,这种方式只应作为开发阶段的临时措施,因为这会极大地降低应用的安全性,不应在...

Global site tag (gtag.js) - Google Analytics