文档章节

使用HttpsURLConnection访问https资源(自签名)

p
 passengers
发布于 2017/07/07 16:44
字数 644
阅读 27
收藏 0
点赞 0
评论 0

https(安全超文本传输协议)与http(超文本传输协议)相比,多了一层SSL认证,需要我们提供特定网点的证书才能访问 如果我们纯粹的用HttpsURLConnection去访问,则会报异常(使用不同的框架会导致所报的异常不同)

解决办法: 一、设置HttpsURLConnection,让它信任所有证书(即跳过验证步骤) 二、为HttpsURLConnection添加一个所信任的证书 代码: 方法一:信任所有证书 public class GetUndoVerifyHttpsRequest {

final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {

    public boolean verify(String hostname, SSLSession session) {
        return true;
    }	//将所有验证的结果都设为true
};

public static String getStart(String urlString) throws Exception {
    HttpURLConnection httpURLConnection;
    HttpsURLConnection httpsURLConnection;

    URL url = new URL(urlString);
    trustAllHosts();
    httpsURLConnection = (HttpsURLConnection) url.openConnection();

    if (url.getProtocol().toLowerCase().equals("https")) {
        httpsURLConnection.setHostnameVerifier(DO_NOT_VERIFY);
        httpURLConnection = httpsURLConnection;
    } else {	//判断是https请求还是http请求
        httpURLConnection = (HttpURLConnection) url.openConnection();
    }
    httpURLConnection.setRequestMethod("GET");
    httpURLConnection.setReadTimeout(5000);

    if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
        InputStream inputStream = httpURLConnection.getInputStream();
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        int len = 0;
        byte[] bytes = new byte[1024];
        while ((len = inputStream.read(bytes)) != -1) {
            byteArrayOutputStream.write(bytes, 0, len);
        }
        String values = new String(byteArrayOutputStream.toByteArray());
        inputStream.close();
        byteArrayOutputStream.close();

        return values;
    }
    return null;
}

/**
 * 不检查任何证书
 */
private static void trustAllHosts() {
    final String TAG = "trustAllHosts";
    // 创建信任管理器
    TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {

        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return new java.security.cert.X509Certificate[]{};
        }

        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            Log.i(TAG, "checkClientTrusted");
        }

        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            Log.i(TAG, "checkServerTrusted");
        }
    }};

    // Install the all-trusting trust manager
    try {
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

} 方法二:添加证书验证 public class GetVerifyHttpsRequest {

private static TrustManagerFactory trustManagerFactory;

public static String getStart(String urlString, Context context) throws Exception {

    CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
    InputStream inputStreamCrt = context.getAssets().open("load-der.crt");//将你所导出的证书放入Assets文件中,在这里引用
    Certificate certificate = certificateFactory.generateCertificate(inputStreamCrt);

    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    keyStore.load(null, null);
    keyStore.setCertificateEntry("ca", certificate);

    String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
    trustManagerFactory = TrustManagerFactory.getInstance(tmfAlgorithm);
    trustManagerFactory.init(keyStore);

    getRequest(urlString);
    return tmfAlgorithm;
}

public static String getRequest(String urlString) throws Exception {
    HttpsURLConnection httpsURLConnection;

    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
    URL url = new URL(urlString);

    httpsURLConnection = (HttpsURLConnection) url.openConnection();
    httpsURLConnection.setSSLSocketFactory(sslContext.getSocketFactory());
    httpsURLConnection.setRequestMethod("GET");
    httpsURLConnection.setReadTimeout(5000);

    if (httpsURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
        InputStream inputStream = httpsURLConnection.getInputStream();
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        int len = 0;
        byte[] bytes = new byte[1024];
        while ((len = inputStream.read(bytes)) != -1) {
            byteArrayOutputStream.write(bytes, 0, len);
        }
        String values = new String(byteArrayOutputStream.toByteArray());
        inputStream.close();
        byteArrayOutputStream.close();

        return values;
    }
    return null;
}

}

(附)普通连接:

public class GetNormalVerifyHttpRequest { public static String getStart(String urlString) throws Exception { HttpsURLConnection httpsURLConnection;

    URL url = new URL(urlString);//获取地址,将其转换成URL类
    httpsURLConnection = (HttpsURLConnection) url.openConnection();//通过地址拿到连接
    httpsURLConnection.setRequestMethod("GET");//设置请求方式(GET请求还是POST)
    httpsURLConnection.setReadTimeout(5000);//设置连接超时时间

    if (httpsURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
//如果返回码等于200,创建一个读入流来读取网络上的数据
        InputStream inputStream = httpsURLConnection.getInputStream();
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        int len = 0;
        byte[] bytes = new byte[1024];
        while ((len = inputStream.read(bytes)) != -1) {
            byteArrayOutputStream.write(bytes, 0, len);
        }//写入数据
        String values = new String(byteArrayOutputStream.toByteArray());//将所读到的数据通过String的构造方法放入values中,并关流返回
        inputStream.close();
        byteArrayOutputStream.close();

        return values;
    }
    return null;
}

}

© 著作权归作者所有

共有 人打赏支持
p
粉丝 0
博文 7
码字总数 2822
作品 0
长沙
你的Android HTTPS真的安全吗?

随着数据量级和维度的不断增加,数据安全已经成为移动互联网行业重点关注的领域。尤其是数据传输过程,是相对比较容易被拦截和嗅探的,因此谷歌对数据传输安全提出了更高的要求,推动Android...

TalkingData ⋅ 2016/09/26 ⋅ 0

Java加密技术(九)——初探SSL

在Java加密技术(八)中,我们模拟了一个基于RSA非对称加密网络的安全通信。现在我们深度了解一下现有的安全网络通信——SSL。 我们需要构建一个由CA机构签发的有效证书,这里我们使用上文中...

mrliuze ⋅ 2015/05/27 ⋅ 0

https客户端证书导入

摘 要 JSSE是一个SSL和TLS的纯Java实现,通过JSSE可以很容易地编程实现对HTTPS站点的访问。但是,如果该站点的证书未经权威机构的验证,JSSE将拒绝信任该证书从而不能访问HTTPS站点。本文在简...

亭子happy ⋅ 2014/04/15 ⋅ 0

Android安全开发之安全使用HTTPS

1、HTTPS简介 阿里聚安全的应用漏洞扫描器中有证书弱校验、主机名弱校验、webview未校验证书的检测项,这些检测项是针对APP采用HTTPS通信时容易出现风险的地方而设。接下来介绍一下安全使用H...

阿里聚安全 ⋅ 2016/10/08 ⋅ 1

Java加密技术(十)——单向认证

在Java 加密技术(九)中,我们使用自签名证书完成了认证。接下来,我们使用第三方CA签名机构完成证书签名。 这里我们使用thawte提供的测试用21天免费ca证书。 1.要在该网站上注明你的域名,...

mrliuze ⋅ 2015/05/27 ⋅ 0

Android实现https网络通信之添加指定信任证书/信任所有证书

当Android客户端访问https网站,默认情况下,受证书信任限制,无法访问,可以有两种解决方法来实现: 1、将要访问的https网站的ca证书添加到客户端信任证书列表中,此种方式为谷歌推荐,安全...

无敌黑咩咩 ⋅ 2016/12/02 ⋅ 0

通过JSSE来发起Https请求

工作中会遇到https请求和接受相关的问题,这篇文章介绍的挺不错,转来记录一下,抽时间还会在这篇文章的基础上增加一些自己理解的东东。 摘 要 JSSE是一个SSL和TLS的纯Java实现,通过JSSE可以...

阿山du ⋅ 2013/12/03 ⋅ 0

HTTPS的证书未经权威机构认证的情况下,访问HTTPS站点的两种方法

注意一下文章中提到的jsse在jdk1.4以后已经集成了,不必纠结. 摘 要 JSSE是一个SSL和TLS的纯Java实现,通过JSSE可以很容易地编程实现对HTTPS站点的访问。但是,如果该站点的证书未经权威机构的...

swearyd457 ⋅ 2015/08/18 ⋅ 0

各种加密算法

如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法) HMAC(Hash Message Authe...

_eric ⋅ 2014/04/11 ⋅ 0

各种Java加密算法

如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法) HMAC(Hash Message Authe...

mifans ⋅ 2016/11/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 19分钟前 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 28分钟前 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 37分钟前 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 50分钟前 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 今天 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

Lombok简单介绍及使用

官网 通过简单注解来精简代码达到消除冗长代码的目的 优点 提高编程效率 使代码更简洁 消除冗长代码 避免修改字段名字时忘记修改方法名 4.idea中安装lombnok pom.xml引入 <dependency> <grou...

to_ln ⋅ 今天 ⋅ 0

【转】JS浮点数运算Bug的解决办法

37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这样,两个只有一位小数的数字相乘,怎...

NickSoki ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部