Java使用SSLContext请求https链接
先了解几个关键类
SSLContext 安全套接字协议的实现核心类
SSLSocket 扩展自Socket用户客户端
SSLSocketFactory 工厂类
SSLServerSocket 扩展自ServerSocket用于服务端
SSLServerSocketFactory SSLServerSocket的工厂
KeyStore 密钥证书
KeyManager 密钥管理器
TrustManager 信任管理器
X590TrustedManager TrustManager的子接口,管理X509证书,验证远程链接
核心代码如下:
//首先自己实现信任管理器类,创建一个X509TrustManager对象
X509TrustManager x509m = new X509TrustManager() {
//返回受信任的X509证书数组
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
//检查服务器的证书,若不信任该证书抛出异常,可以不检查默认都信任
@Override
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
//检查客户端证书,若不信任该证书抛出异常,咱们自己就是客户端不用检查
@Override
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
};
// 获取一个SSLContext实例,核心对象
SSLContext s = SSLContext.getInstance("SSL");
// 初始化SSLContext.init(可以导入的证书,信任管理器,SecureRandom) 三个参数都可为null,没有证书填写null就行
s.init(null, new TrustManager[] { x509m }, new java.security.SecureRandom());
//获取SSLSocket 用于通信
SSLSocketFactory factory = s.getSocketFactory();
SSLSocket s = (SSLSocket) factory.createSocket("localhost", port);
//获取输入输出流
OutputStream output = s.getOutputStream();
InputStream input = s.getInputStream();
//发送数据
DataOutputStream out = new DataOutputStream(output);
out.writeBytes("测试发送数据");
out.flush();
out.close();
//接收数据
Reader reader = new InputStreamReader(input, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(reader);
String str = null;
StringBuffer sb = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
sb.append(str);
}
reader.close();
System.out.println(sb.toString()); //打印返回的数据
这就是Java最原始的使用SSLContext创建SSLSocket发送https请求。
如果使用框架如okhttp httpclient 底层已经实现https请求,CA机构颁发的证书或者权威机构颁发的证书都是直接信任的 直接使用即可不需要再重写任何代码,网上的好多文章说的都有点问题,我已经亲测可用,对于自己生成的证书的https服务才需要另外配置SSLContext这套代码。