public String testReqHttpsTrustCert() throws Exception {// 读取jdk预置证书KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());try(InputStream ksIs = new FileInputStream(System.getProperty("java.home") + "/lib/security/cacerts")) {keyStore.load(ksIs, "changeit".toCharArray());}// 读取证书文件CertificateFactory cf = CertificateFactory.getInstance("X.509");try(InputStream certIs = this.getClass().getResourceAsStream("/cert/cert.crt")) {Certificate c = cf.generateCertificate(certIs);keyStore.setCertificateEntry("demo", c);}// 生成信任管理器TrustManagerFactory tmFact = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());tmFact.init(keyStore);// 生成SSLSocketFactorySSLContext sslContext = SSLContext.getInstance("TLSv1.2");sslContext.init(null, tmFact.getTrustManagers(), new SecureRandom());SSLSocketFactory ssf = sslContext.getSocketFactory();// 发送https请求URL url = new URL("https://www.demo.com/user/list");HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();connection.setHostnameVerifier((hostname, session) -> hostname.endsWith("demo.com"));connection.setSSLSocketFactory(ssf);String result;try(InputStream inputStream = connection.getInputStream()){result = IOUtils.toString(inputStream, StandardCharsets.UTF_8);}connection.disconnect();return result;}
注:虽然2种方法都可以解决问题 , 但第1种方法使得java程序对环境形成了依赖 , 一旦部署环境发生变化 , java程序可能就报错了 , 因此更推荐使用第2种方法 。总结到这里 , JCA相关类的使用就介绍完了 , 如下表格中总结了JCA的常用类:
文章插图
本篇花了近一周时间整理 , 内容较多 , 对这块不太熟悉的同学 , 可以先关注收藏起来当示例手册 , 待需要时再参阅即可 。
【Java实现7种常见密码算法】
经验总结扩展阅读
- [WPF] 抄抄超强的苹果官网滚动文字特效实现
- Java函数式编程:一、函数式接口,lambda表达式和方法引用
- 不妨试试更快更小更灵活Java开发框架Solon
- 11 微服务架构学习与思考:开源 API 网关02-以 Java 为基础的 API 网关详细介绍
- java 新特性之 Stream API
- java 入土--集合详解
- 4 Java I/O:AIO和NIO中的Selector
- 2023容易暴富的星座女实现质的飞跃
- 通过 Github Action 实现定时推送天气预报
- 3 Java I/O:NIO中的Buffer