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.htmlhttp://blog.csdn.net/faye0412/article/details/6883879
分享到:
相关推荐
树与二叉树是树形结构中的基本概念,而将无根树转换为有根树是处理这类数据结构时常常会遇到的问题。在这个主题中,我们将深入探讨树的基本概念、无根树与有根树的区别,以及如何进行这种转换。 首先,让我们了解树...
ISRG Root X1证书的广泛部署意味着它被大多数现代浏览器和操作系统信任,允许用户安全地访问采用此证书签名的网站。 这个安装助手"无根"的描述可能意味着它不需要管理员权限即可运行,这样普通用户就能方便地在他们...
黄白助手 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这很无聊! RootLessInstaller 1.0现在具有内置的修补程序!从此仓库的“发布”选项卡中获取它! 从此处或复制调整下载链接!无根安装程序的预修补Debs。由reddit用户/ u / kiityman制作
1. **MediaProjectionManager**: 这是Android 5.0引入的关键组件,它允许开发者访问用户的屏幕内容。首先,我们需要请求用户的许可来启动屏幕投影服务,这通常通过Intent.ACTION_MEDIA_PROJECTION触发一个权限请求...
无根安装程序的概念意味着这些包管理器在执行任务时,尽可能避免使用管理员权限,除非绝对必要。这样可以防止恶意软件或者意外操作对系统核心组件造成破坏,并且使得普通用户也能安装和管理自己所需的软件。 GCC,...
深度优先搜索(DFS,Depth-First Search)与广度优先搜索(BFS,Breadth-First Search)是图论中的两种基本搜索算法,广泛应用于计算机科学领域,尤其是在解决图和树的遍历问题时。这两种算法都是用来探索图的所有...
通过在无根容器中运行UniFi控制器,将其配置为systemd服务,并自动执行图像更新。 该项目使用提供的 映像,并使用提供的 -compose进行了最小的更改。 要求 该项目使用Podman,Python和 。 按照安装Podman。 只需安装...
NetGuard提供了简单和高级的方法来阻止对Internet的访问-不需要根目录。
无根 关于 来自 appcompat 的自定义键盘,带有一些选项。 日志记录 - 每当目标启动键盘时,在后台启动过程中,将纯 HTTP 发送到服务器进行初始化。 每 20 秒发送一次新请求。 当目标按任意键时,发生捕获并准备...
无根像素启动器埃米尔·扎伊迪(Amir Zaidi)链接Play商店发布: : 图片和视频: : APK下载: : 无根像素桥: : Magisk版本(仅适用于Pixel用户): : 阿尔法: : 联系人: : 想象我的启动器与AOSP启动器非常...
这表明你需要将相关文件上传到服务器的特定目录,即/install,这样Cydia源就能被Cydia客户端识别并访问。当用户在他们的越狱设备上添加了这个源地址后,他们就可以浏览和下载你提供的软件包。 从压缩包子文件的文件...
自托管:无根泊坞窗组成+ traefik
VC网络防火墙,基于费尔的Ndis Hook技术
具有自签名证书的Dockerized Wordpress群群集。 服务 码头工人 GlusterFS 玛丽亚数据库 WordPress的 UFW作为防火墙 自签名证书 HAProxy作为负载均衡器 可选:LetsEncrypt集成 局限性 如果数据库服务节点死亡,将...
网络卫士 NetGuard提供了简单而先进的方法来阻止对Internet的... (可选)在应用程序访问互联网时通知 (可选)记录每个应用程序每个地址的网络使用情况 (可选)(如果从Play商店安装则不可用) 具有明暗主题的材料
没有根的Android Logcat ... 当某些电话也通过USB连接时,在处理网络ADB连接时也会遇到问题。 有时建立与ADB的连接会挂起,并要求终止并重新启动该应用程序。 这似乎是ADB守护程序本身的问题,而不是应用程序的问题。
基于LD_PRELOAD工具(不足以运行无根容器,但缺乏对静态二进制文件的支持): 基于ptrace(2)工具(不足以运行无根容器,但速度较慢): 基于user_namespaces(7)工具(如--copy-up一样,但不支持--copy-up ,-- --...
是一个单一网站,用于跟踪各种项目中无根容器支持的进度。 我不擅长整个“ Web开发”工作,因此我为所有事情表示歉意。 用法 该站点是使用 “构建”的,因此只需运行以下命令: % hugo server Start building ...