`
dyccsxg
  • 浏览: 205215 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类

无根证书时访问 https

 
阅读更多
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
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.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

/**
 * 通过自定义 TrustManager 来实现无根证书时访问 https
 * @date    2013-8-29
 * @file    HttpsClient.java
 */
public class HttpsClient {
    
	/**
	 * 测试 https
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		// init https
		HttpsClient.init();
		
		URL url = new URL("https://www.12306.cn/mormhweb/");
		url.openConnection();
		InputStream in = url.openStream();
		BufferedReader buf = new BufferedReader(new InputStreamReader(in));
		String line = null;
		while ((line = buf.readLine()) != null){
			System.out.println(line);
		}
		buf.close();
		in.close();
		
		System.out.println("-- finished --");
	}
    
	/**
	 * 初始化
	 */
	public static void init() {
		try {
			SSLContext sslCtx = SSLContext.getInstance("TLS");
			sslCtx.init(null, new TrustManager[]{new MyTrustManager()}, null);
			SSLSocketFactory sslSocketFactory = sslCtx.getSocketFactory();
			HttpsURLConnection.setDefaultSSLSocketFactory(sslSocketFactory);
			HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
				@Override
				public boolean verify(String hostname, SSLSession session) {
					return true;
				}
			});
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
}
/**
 * 默认信任服务端根证书
 */
class MyTrustManager implements X509TrustManager {
    
	@Override
	public void checkClientTrusted(X509Certificate[] chain, String authType)
			throws CertificateException {
		return;
	}
    
	@Override
	public void checkServerTrusted(X509Certificate[] chain, String authType)
			throws CertificateException {
		return;
	}
    
	@Override
	public X509Certificate[] getAcceptedIssuers() {
		return null;
	}
}
# 访问 https 时有两个问题需要注意
# 1. 客户端需要存在有效的根证书
相应的异常信息:
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380)
... 19 more
处理方法:
HttpsURLConnection.setDefaultSSLSocketFactory(sslSocketFactory);
# 2. 访问 https 时的域名需要与根证书中声明的域名一致
相应的异常信息:
Caused by: java.security.cert.CertificateException: No name matching www.12306.cn found
at sun.security.util.HostnameChecker.matchDNS(HostnameChecker.java:208)
at sun.security.util.HostnameChecker.match(HostnameChecker.java:93)
at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:347)
at sun.security.ssl.AbstractTrustManagerWrapper.checkAdditionalTrust(SSLContextImpl.java:847)
at sun.security.ssl.AbstractTrustManagerWrapper.checkServerTrusted(SSLContextImpl.java:814)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1320)
... 13 more
处理方法:
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
	@Override
	public boolean verify(String hostname, SSLSession session) {
		return true;
	}
});
# 相关链接
http://wenku.baidu.com/view/ce0f191852d380eb62946d6a.html
http://blog.csdn.net/faye0412/article/details/6883879
分享到:
评论

相关推荐

    算法-树形结构- 树与二叉树- 无根树转有根树.rar

    树与二叉树是树形结构中的基本概念,而将无根树转换为有根树是处理这类数据结构时常常会遇到的问题。在这个主题中,我们将深入探讨树的基本概念、无根树与有根树的区别,以及如何进行这种转换。 首先,让我们了解树...

    ISRG_Root_X1_Installer:用于安装ISRG Root X1证书的帮助程序。 无根

    ISRG Root X1证书的广泛部署意味着它被大多数现代浏览器和操作系统信任,允许用户安全地访问采用此证书签名的网站。 这个安装助手"无根"的描述可能意味着它不需要管理员权限即可运行,这样普通用户就能方便地在他们...

    黄白助手 1.7-8_无根.deb

    黄白助手 1.7-8_无根.deb

    “裁枝剪叶”问题,一道 编程竞赛题

    文件名:cut.* 输入文件:cut.in(文本文件,选手按... 一个数,表示当1时,经过一系列“裁枝剪叶”之后所能得到无根树上的节点值之和的最大值。 输入样例: 7 -1 -1 -1 1 1 1 0 1 4 2 5 3 6 4 7 5 7 6 7 输出样例: 3

    RootLessInstallerDEB:无根安装程序的预修补Debs

    RootLessInstallerDEB这很无聊! RootLessInstaller 1.0现在具有内置的修补程序!从此仓库的“发布”选项卡中获取它! 从此处或复制调整下载链接!无根安装程序的预修补Debs。由reddit用户/ u / kiityman制作

    ScreenRecorder,在android 5.0 上使用mediaprojectionmanager、virtualdisplay、audiorecord、mediacodec和mediamuxer api实现无根屏幕捕获.zip

    1. **MediaProjectionManager**: 这是Android 5.0引入的关键组件,它允许开发者访问用户的屏幕内容。首先,我们需要请求用户的许可来启动屏幕投影服务,这通常通过Intent.ACTION_MEDIA_PROJECTION触发一个权限请求...

    规范:无根安装程序

    无根安装程序的概念意味着这些包管理器在执行任务时,尽可能避免使用管理员权限,除非绝对必要。这样可以防止恶意软件或者意外操作对系统核心组件造成破坏,并且使得普通用户也能安装和管理自己所需的软件。 GCC,...

    深度广度优先搜索

    深度优先搜索(DFS,Depth-First Search)与广度优先搜索(BFS,Breadth-First Search)是图论中的两种基本搜索算法,广泛应用于计算机科学领域,尤其是在解决图和树的遍历问题时。这两种算法都是用来探索图的所有...

    unifi-controller:Podman-compose配置,可将UniFi Controller作为无根容器运行

    通过在无根容器中运行UniFi控制器,将其配置为systemd服务,并自动执行图像更新。 该项目使用提供的 映像,并使用提供的 -compose进行了最小的更改。 要求 该项目使用Podman,Python和 。 按照安装Podman。 只需安装...

    NetGuard,没有根安卓防火墙.zip

    NetGuard提供了简单和高级的方法来阻止对Internet的访问-不需要根目录。

    KeyLogger:目标 SDK 17. 无根

    无根 关于 来自 appcompat 的自定义键盘,带有一些选项。 日志记录 - 每当目标启动键盘时,在后台启动过程中,将纯 HTTP 发送到服务器进行初始化。 每 20 秒发送一次新请求。 当目标按任意键时,发生捕获并准备...

    Launcher3:Launcher3前叉,称为“无根像素启动器”

    无根像素启动器埃米尔·扎伊迪(Amir Zaidi)链接Play商店发布: : 图片和视频: : APK下载: : 无根像素桥: : Magisk版本(仅适用于Pixel用户): : 阿尔法: : 联系人: : 想象我的启动器与AOSP启动器非常...

    DCRM5.2-自建cydia个人源

    这表明你需要将相关文件上传到服务器的特定目录,即/install,这样Cydia源就能被Cydia客户端识别并访问。当用户在他们的越狱设备上添加了这个源地址后,他们就可以浏览和下载你提供的软件包。 从压缩包子文件的文件...

    自托管:无根泊坞窗组成+ traefik

    自托管:无根泊坞窗组成+ traefik

    NetGuard网络防火墙,基于费尔的钩子技术

    VC网络防火墙,基于费尔的Ndis Hook技术

    wpcluster_poc:具有自签名证书的Dockerized Wordpress群群集

    具有自签名证书的Dockerized Wordpress群群集。 服务 码头工人 GlusterFS 玛丽亚数据库 WordPress的 UFW作为防火墙 自签名证书 HAProxy作为负载均衡器 可选:LetsEncrypt集成 局限性 如果数据库服务节点死亡,将...

    NetGuard:一种阻止每个应用访问互联网的简单方法

    网络卫士 NetGuard提供了简单而先进的方法来阻止对Internet的... (可选)在应用程序访问互联网时通知 (可选)记录每个应用程序每个地址的网络使用情况 (可选)(如果从Play商店安装则不可用) 具有明暗主题的材料

    rootless-logcat:无根的Android Logcat应用

    没有根的Android Logcat ... 当某些电话也通过USB连接时,在处理网络ADB连接时也会遇到问题。 有时建立与ADB的连接会挂起,并要求终止并重新启动该应用程序。 这似乎是ADB守护程序本身的问题,而不是应用程序的问题。

    rootlesskit:Linux原生的“假根”,用于实现无根容器

    基于LD_PRELOAD工具(不足以运行无根容器,但缺乏对静态二进制文件的支持): 基于ptrace(2)工具(不足以运行无根容器,但速度较慢): 基于user_namespaces(7)工具(如--copy-up一样,但不支持--copy-up ,-- --...

    rootlesscontaine.rs:网站跟踪无根容器的进度

    是一个单一网站,用于跟踪各种项目中无根容器支持的进度。 我不擅长整个“ Web开发”工作,因此我为所有事情表示歉意。 用法 该站点是使用 “构建”的,因此只需运行以下命令: % hugo server Start building ...

Global site tag (gtag.js) - Google Analytics