http系列 - SSL请求,需要JKS证书的情况,如何做连接

2024-05-09 17:38

本文主要是介绍http系列 - SSL请求,需要JKS证书的情况,如何做连接,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 有些响应https请求的接口,需要在客户端添加证书的情况,其目的是加密在网络之间传输的请求报文,保证信息安全;

 

证书的加密方式多种多样,本案例以JKS加密的证书为例:

1.获取证书私钥PrivateKey 

private static PrivateKey getPrivateKey(String priKeyFile, String storePassword) throws Exception {char[] storePwdArr;int i;BufferedInputStream bis = null;try {KeyStore ks = KeyStore.getInstance("JKS");//加载证书FileInputStream fis = new FileInputStream(priKeyFile);bis = new BufferedInputStream(fis);//证书中的加密keyString storeAlias = "signKey";storePwdArr = new char[storePassword.length()];// store passwordfor (i = 0; i < storePassword.length(); i++) {storePwdArr[i] = storePassword.charAt(i);}ks.load(bis, storePwdArr);PrivateKey priv = (PrivateKey) ks.getKey(storeAlias, storePwdArr);return priv;} catch (KeyStoreException e) {e.printStackTrace();throw new Exception("1");} catch (FileNotFoundException e) {e.printStackTrace();throw new Exception("2", e);} catch (NoSuchAlgorithmException e) {e.printStackTrace();throw new Exception("3", e);} catch (CertificateException e) {e.printStackTrace();throw new Exception("4", e);} catch (IOException e) {e.printStackTrace();throw new Exception("5", e);} catch (UnrecoverableKeyException e) {e.printStackTrace();throw new Exception("6", e);} finally {if (bis != null) {try {bis.close();} catch (IOException e) {e.printStackTrace();}}}}

SSL实现(HTTP请求):

1.请求构建:

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpConnectionManager;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
import org.apache.commons.httpclient.protocol.Protocol;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** HTTP请求* */
public class HttpRequestUtil
{final static String PROTOCOL_NAME = "https";private static final Logger logger = LoggerFactory.getLogger(HttpRequestUtil.class);public static String sendJsonWithHttp(String surl, String json) throws Exception{URL url = new URL(surl);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");conn.setRequestMethod("POST");// 提交模式conn.setRequestProperty("Content-Length", json.getBytes().length + "");conn.setConnectTimeout(100000);// 连接超时单位毫秒 //conn.setReadTimeout(200000);// 读取超时 单位毫秒conn.setDoOutput(true);// 是否输入参数conn.setDoInput(true);conn.setUseCaches(false);conn.connect();DataOutputStream out = new DataOutputStream(conn.getOutputStream());out.write(json.getBytes());out.flush();out.close();BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));StringBuffer sb = new StringBuffer();String line;while ((line = reader.readLine()) != null){sb.append(line);}reader.close();conn.disconnect();return sb.toString();}public static  String https(String surl, String json){HttpClient client =getHttpClient();client.getParams().setContentCharset("UTF-8");PostMethod post = new PostMethod(surl);ByteArrayOutputStream baos = new ByteArrayOutputStream();Protocol httpProtocol;try {//声明协议类型httpProtocol = new Protocol(PROTOCOL_NAME, new SSLProtocolSocketFactory(false), 443);Protocol.registerProtocol(PROTOCOL_NAME, httpProtocol);//声明报文格式post.setRequestHeader("Content-Type", "application/json;charset=utf-8");RequestEntity requestEntity = null;requestEntity = new ByteArrayRequestEntity(json.getBytes("utf-8"));post.setRequestEntity(requestEntity);//执行调用client.executeMethod(post);String off = "ON";InputStream in = null;in = post.getResponseBodyAsStream();byte[] buf = new byte[2048];do{int n = in.read(buf);;if (n > 0){baos.write(buf, 0, n);}else if (n <= 0){break;}} while (true);}catch (HttpException e) {  logger.info("http exception when send http.", e);  } catch (IOException e) {  logger.info("io exception when send http.", e);  }finally {post.releaseConnection(); httpProtocol=null;}return baos.toString();}private static HttpClient httpClient=null;public static  HttpClient getHttpClient(){if(httpClient==null){HttpConnectionManager httpConnectionManager = new MultiThreadedHttpConnectionManager();HttpConnectionManagerParams params = httpConnectionManager.getParams();params.setConnectionTimeout(1000*60); params.setSoTimeout(20000); //避免异常的两行diamanteparams.setDefaultMaxConnectionsPerHost(1000);params.setMaxTotalConnections(2000);httpClient = new HttpClient(httpConnectionManager);}return httpClient;}
}

2.SSLProtocolSocketFactory必不可少

import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;import javax.net.SocketFactory;import org.apache.commons.httpclient.ConnectTimeoutException;
import org.apache.commons.httpclient.params.HttpConnectionParams;
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;/*** */
public class SSLProtocolSocketFactory implements ProtocolSocketFactory {private boolean isChkCert;public SSLProtocolSocketFactory(boolean chkCert) {this.isChkCert = chkCert;}@Overridepublic Socket createSocket(String host, int port, InetAddress localAddress, int localPort, HttpConnectionParams params) throws IOException, UnknownHostException, ConnectTimeoutException {if (params == null) {throw new IllegalArgumentException("Parameters may not be null!");}int timeout = params.getConnectionTimeout();SocketFactory socketFactory = SSLContextFactory.getInstance(this.isChkCert).getSocketFactory();if (timeout == 0) {return createSocket(host, port, localAddress, localPort);}Socket socket = socketFactory.createSocket();SocketAddress localAddress_ = new InetSocketAddress(localAddress, localPort);SocketAddress remoteAddress = new InetSocketAddress(host, port);socket.bind(localAddress_);socket.connect(remoteAddress, timeout);return socket;}@Overridepublic Socket createSocket(String host, int port, InetAddress localAddress, int localPort) throws IOException, UnknownHostException {return SSLContextFactory.getInstance(this.isChkCert).getSocketFactory().createSocket(host, port, localAddress, localPort);}@Overridepublic Socket createSocket(String host, int port) throws IOException, UnknownHostException {return SSLContextFactory.getInstance(this.isChkCert).getSocketFactory().createSocket(host, port);}
}

3.SSLContextFactory 

import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** */
public class SSLContextFactory {private static final Logger logger = LoggerFactory.getLogger(SSLContextFactory.class);private static SSLContext ctx;private final static String PROTOCAL_NAME = "SSL";public static SSLContext getInstance(boolean chkCert) {if (ctx == null) {try {ctx = SSLContext.getInstance(PROTOCAL_NAME);if (chkCert) {logger.error("请实现证书信任连接!");} else {ctx.init(null, new TrustManager[] {new TrustAnyTrustManager()}, new SecureRandom());}} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (KeyManagementException e) {e.printStackTrace();}return ctx;}return ctx;}
}

 

 

 

这篇关于http系列 - SSL请求,需要JKS证书的情况,如何做连接的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/974055

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

Java 连接Sql sever 2008

Java 连接Sql sever 2008 /Sql sever 2008 R2 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class TestJDBC

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0