Java如何使用SSLContext请求https链接
作者:大魔王King
这篇文章主要介绍了Java如何使用SSLContext请求https链接问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
使用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这套代码。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。