无根证书时访问 https

本文介绍了一种在Java中实现HTTPS请求的方法,特别是在没有根证书的情况下如何配置客户端以避免证书验证错误。通过自定义TrustManager和HostnameVerifier,可以绕过证书检查,这对于测试或特殊情况非常有用。
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.youkuaiyun.com/faye0412/article/details/6883879
<think>好的,用户想找关于无根插件的开发、使用、教程和资料。首先,我需要明确“无根插件”具体指什么。无根这个词可能有不同的解释,比如在容器技术中,无根容器(Rootless Container)是指不需要root权限运行的容器,相关插件可能涉及Docker或Podman的无根模式。另外,在某些框架或系统中,可能也有名为“无根插件”的组件。 接下来,我应该检查用户的问题是否有拼写错误或术语混淆的可能。比如是否应该是“无根插件”还是其他类似名称的插件。假设用户术语正确,我需要确定最常见的应用场景。容器技术中的无根模式比较常见,所以可能用户指的是这方面的资料。 然后,我会搜索站内是否有相关教程或文档。例如,Docker和Podman的官方文档都有关于无根容器的配置和使用指南。另外,可能有一些第三方教程或博客文章介绍如何开发和配置无根插件。 还需要考虑用户的使用场景。如果用户是开发者,可能需要开发无根插件的具体步骤和API文档;如果是普通用户,可能更关注如何安装和使用现有的无根插件。因此,回答需要涵盖开发和使用的不同方面,并提供资源链接。 另外,可能需要提到安全性,因为无根模式通常与提升安全性相关,比如减少权限滥用风险。同,兼容性和常见问题也是用户可能关心的点,比如不同系统下的配置差异或遇到的权限问题如何处理。 最后,生成相关问题,帮助用户进一步探索该主题,比如性能优化、具体应用案例、与其他技术的集成等。</think>### 关于无根插件的开发与使用资料 无根插件(Rootless Plugin)通常指在无需系统管理员权限(root权限)下运行的插件,常见于容器化技术(如Docker、Podman)或安全敏感场景。以下是相关资料的整理: --- #### 1. **核心概念** - **无根模式原理**:通过用户命名空间(User Namespace)实现权限隔离,允许普通用户模拟部分root功能[^1]。 - **应用场景**:安全沙箱、容器化部署、多用户环境下的资源隔离。 --- #### 2. **开发教程** - **Docker无根插件开发**: 1. 使用`rootlesskit`工具包创建无根环境; 2. 通过API绑定非特权端口(如使用`slirp4netns`网络栈); 3. 示例代码片段: ```bash # 启动无根Docker守护进程 dockerd-rootless.sh ``` 参考文档:[Docker Rootless Mode](https://docs.docker.com/engine/security/rootless/) [^2] - **Podman无根容器**: Podman默认支持无根模式,开发需配置用户命名空间: ```bash podman run --userns=keep-id -d nginx ``` --- #### 3. **使用指南** - **安装与配置**: - Docker无根模式需安装`uidmap`和`fuse-overlayfs`; - 验证环境:`docker info | grep Rootless` - **权限管理**: - 使用`sysctl`调整非特权用户资源限制; - 避免直接操作`/sys`或`/proc`等敏感目录。 --- #### 4. **常见问题** - **网络限制**:无根模式下无法绑定1024以下端口,需通过iptables转发; - **文件系统挂载**:部分文件系统(如NFS)需要额外配置[^3]。 --- #### 5. **推荐资料** 1. **官方文档**: - [Docker Rootless官方指南](https://docs.docker.com/engine/security/rootless/) - [Podman无根容器手册](https://github.com/containers/podman/blob/main/docs/tutorials/rootless_tutorial.md) 2. **教程文章**: - 《深入理解Linux用户命名空间》(技术博客) - 《无根容器的安全实践》(Medium专栏) ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值