Java调用HTTPS接口,绕过SSL认证

这篇具有很好参考价值的文章主要介绍了Java调用HTTPS接口,绕过SSL认证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.Java调用HTTPS接口,绕过SSL认证

Java调用HTTPS接口,绕过SSL认证,笔记,https,ssl,网络协议

1:说明

网络编程中,HTTPS(Hypertext Transfer Protocol Secure)是一种通过加密的方式在计算机网络上进行安全通信的协议。网络传输协议,跟http相比更安全,因为他加上了SSL/TLS协议来加密通信内容。

Java调用HTTPS,需要与客户端建立连接,但是建立连接的时候,需要进行SSL认证。有的时候为了方便调用,我们会绕过SSL认证。但是在特定环境中,绕过SSL认证是十分不安全的,不推荐这么做。SSL认证是确保通信安全的重要手段,绕过认证的话可能带来一系列的安全问题。

所以一般绕过SSL认证不在生产环境中使用。

2:绕过SSL认证

因为我本次调用HTTPS接口的目的是调用数据,存储在表中,不需要跨环境,只在本地执行,所以进行SSL认证稍有繁琐,所以我决定绕过SSL认证。

通过自定义SSL上下文的方式,绕过SSL认证的方式。通过自定义信任管理器,你可以在绕过证书验证的同时,实现自己的证书验证逻辑。这对于使用自签名证书或特定信任机制的情况很有用。

最后返回一个绕过SSL认证的 HttpClient对象。

import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;


// 创建自定义的 SSL 上下文,用于绕过证书验证
	public static CloseableHttpClient createSSLClientDefault() {
		try {
			SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
				// 信任所有证书
				public boolean isTrusted(X509Certificate[] arg0, String arg1)
						throws CertificateException {
					return true;
				}
			}).build();
			// 创建主机名验证器,用于绕过主机名验证
			HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
			// 创建 SSL 连接套接字工厂,将自定义的 SSL 上下文和主机名验证器应用于 HTTPS 连接
			SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
			// 创建自定义的 CloseableHttpClient 实例,将 SSL 连接套接字工厂应用于 HTTP 客户端
			return HttpClients.custom().setSSLSocketFactory(sslsf).build();
		} catch (KeyManagementException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (KeyStoreException e) {
			e.printStackTrace();
		}
		return HttpClients.createDefault();
	}

该方法的实现逻辑如下:

  1. 创建一个自定义的 SSL 上下文(SSLContext),用于绕过 SSL 证书验证。
  2. 在 SSL 上下文中加载信任材料(TrustMaterial),并使用自定义的 TrustStrategy 来信任所有证书。
  3. 创建一个主机名验证器(HostnameVerifier),用于绕过主机名验证。使用NoopHostnameVerifier(主机名验证器)意味着在SSL连接中不会对服务器的主机名进行验证。主机名验证器用于验证SSL证书中的主机名与服务器实际的主机名是否匹配。NoopHostnameVerifier是一个空实现的主机名验证器,它绕过了主机名验证,即使主机名不匹配,也会继续进行SSL连接。
  4. 创建一个 SSL 连接套接字工厂(SSLConnectionSocketFactory),将自定义的 SSL 上下文和主机名验证器应用于 HTTPS 连接。创建自定义的SSL连接。有四种实现方式(指定SSL/TLS协议版本、指定加密算法和密码套件、自定义信任管理器、自定义主机名验证器),其中通过SSLConnectionSocketFactory指定自定义的主机名验证器(HostnameVerifier),以控制主机名验证的行为。
  5. 创建一个自定义的 CloseableHttpClient 实例,使用上述的 SSL 连接套接字工厂。
  6. 如果在创建 SSL 上下文时发生异常,将打印异常堆栈跟踪信息。
  7. 如果在创建 SSL 上下文时发生异常或抛出的异常类型无法识别,将返回默认的 CloseableHttpClient 实例。

3:调用HTTPS接口

private static final String SERVICE_URL = "https://ip:port/api/v1/cipher/json/create";
    private static final String AUTHORIZATION_HEADER = "savhsdkfas==";

    public ReturnT<String> execute(String param) throws Exception {

        //发送httpPost请求
        //创建HttpClient
        HttpClient httpclient = Myutils.createSSLClientDefault();
        //发送接口地址
        HttpPost httppost = new HttpPost(SERVICE_URL);
        //设置请求体格式Content-Type
        httppost.setHeader("Content-Type", "application/json");
        httppost.setHeader("Authorization", AUTHORIZATION_HEADER);

        //定义String请求Json参数体
        httppost.setEntity(new StringEntity(new String("{" +
                "\"keyCode\": \"" + keycode + "\"," +
                "\"algorithmParam\": \"SM4/ECB/PKCS7Padding\"," +
                "\"data\": {" +
                "\"SetlNewDTO\": \"" + this.convertDtoToBase64(accountPayDO) + "\"" +
                "}" +
                "}"), Charset.forName("UTF-8")));
        //发送请求并接收response
        HttpResponse httpresponse = httpclient.execute(httppost);
        String result = EntityUtils.toString(httpresponse.getEntity(), "UTF-8");

        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode responseJson = objectMapper.readTree(result);
        // 从JSON对象中获取键值对,根据出参格式获取出参数据
        JsonNode jsonNode = responseJson.get("data");
        JsonNode encData1 = jsonNode.get("encData");
        String encDate2 = encData1.toString();

    }

这段代码是一个使用Apache HttpClient库发送HTTP POST请求的示例。它发送一个带有JSON参数的POST请求,并从响应中提取特定的数据。

代码中的execute方法声明了抛出Exception异常,它接收一个String类型的参数param,但实际上没有使用到该参数。

首先,代码定义了服务的URL和授权头信息。

然后,通过调用Myutils.createSSLClientDefault()方法创建一个自定义的SSL HttpClient对象。就是上边绕过SSL对应的方法

接下来,创建一个HttpPost对象,并设置请求的URL和请求头信息。

然后,构造请求体的JSON参数,并设置到HttpPost对象中。

构造请求体的使用需要使用json格式参数,也可以直接使用 GJson json = new GJson(jsonStr);将非JSON数据转化为JSON格式,JSON格式的S他脸红,需要给每个参数加上引号,并且使用\转译。所以setEntity的时候需要带有JSON格式的字符串。

String jsonStr = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";

GJson json = new GJson(jsonStr);

接着,通过调用HttpClient的execute方法发送HttpPost请求,并接收HttpResponse响应。

将响应的实体内容转换为字符串,并存储在result变量中。

使用Jackson库的ObjectMapper类解析result字符串为JsonNode对象。

从JsonNode对象中获取特定的数据,例如从"data"键中获取"encData"键的值。

最后,将获取到的"encData"值存储在encDate2变量中。

我的出参是这样的,所以按照自己的格式替换数据,便可以得到你想要的出参

{
	"code": "0",
	"message": "success",
	"data": {
		"encData": {
			"date": "wxpOGSdQD68Jp7fC4KV"
		}
	}
}

需要注意的是,代码中的URL、授权头信息、JSON参数等是示例数据,你需要根据实际情况进行修改和替换。

此代码片段只是一个简单的示例,实际使用时应该考虑异常处理、资源释放等更完善的逻辑。

 最高级的自律,从一点点到亿点点。

二. Java直接调用HTTP接口,并且获取List出参,输出数据List

1.代码实现 

public WrapperResponse<List<WarningDTO>> queryBigWarning(WarnInfoBInfoQueryDTO warnInfoBInfoQueryDTO) throws Exception {
    String SERVICE_URL = "http://127.0.0.1:8889/wakljfa";
        //发送httpPost请求
        //创建HttpClient
        HttpClient httpclient = HttpClients.createDefault();
        //发送接口地址
        HttpPost httppost = new HttpPost(SERVICE_URL);
        //定义String请求Json参数体
        httppost.setEntity(new StringEntity(new String("{" +
                "\"pageNum\": \"" + warnInfoBInfoQueryDTO.getPageNum() + "\"," +
                "\"pageSize\": \"" + warnInfoBInfoQueryDTO.getPageSize() + "\"," +
                "\"warnType\": \"" + warnInfoBInfoQueryDTO.getWarnType() + "\"" +
                "}"), Charset.forName("UTF-8")));

        httppost.setHeader("Content-Type", "application/json");
        //发送请求并接收response
        HttpResponse httpresponse = httpclient.execute(httppost);
        String result = EntityUtils.toString(httpresponse.getEntity(), "UTF-8");

        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode responseJson = objectMapper.readTree(result);
        // 从JSON对象中获取键值对,根据出参格式获取出参数据
        JsonNode data = responseJson.get("data");
        JsonNode listWarn = pageInfo.get("list");

        Iterator<JsonNode> iterator = listWarn.iterator();
        List<WarningDTO> warningDTOS = new ArrayList<>();
        while (iterator.hasNext()) {
            WarningDTO warningDTO = new WarningDTO();
            JsonNode warningNode =  iterator.next();
            String warnOcurTime= warningNode.get("warnOcurTime").asText();
            warningDTO.setWarnOcurTime(warnOcurTime);
            String warnId= warningNode.get("warnId").asText();
            warningDTO.setWarnId( warnId);
            String id= warningNode.get("id").asText();
            warningDTO.setId( Id);
            warningDTOS.add(warningDTO);
        }
        return WrapperResponse.success(warningDTOS);
}

2.出参模式

"data": {
			"list": [
				{
					"warnId": "000000000000000000000000000201",
					"warnOcurTime": 1672502400000,
					"id": "000000000000000000000000000201"
				},
				{
					"warnId": "000000000000000000000000000301",
					"warnOcurTime": 1672502400000,
	                "id": "000000000000000000000000000301"
				}
			]
}

(•̀ᴗ• ) ̑̑  看到这的朋友。如果可以的话。点点下边的链接帮我投上两票哦。๐•ᴗ•๐✧๐•ᴗ•๐✧(•‿•)

掘金2023年度人气创作者打榜中,快来帮我打榜吧~ <https://activity.juejin.cn/rank/2023/writer/2606267657622381?utm_campaign=annual_2023&utm_medium=self_web_share&utm_source=Recently%E7%A5%9D%E7%A5%9D>

Java调用HTTPS接口,绕过SSL认证,笔记,https,ssl,网络协议文章来源地址https://www.toymoban.com/news/detail-738308.html

到了这里,关于Java调用HTTPS接口,绕过SSL认证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【网络安全】https与证书原理 | SSL Pinning及其绕过

    参考: https://segmentfault.com/a/1190000009002353?sort=newest https://zhuanlan.zhihu.com/p/353571366 https://juejin.cn/post/6863295544828444686 HTTPS=HTTP+TLS,其它的协议也类似,如FTPS=FTP+TLS 1) ClientHello Client 首先发送本地的 TLS 版本、支持的加密算法套件,并且生成一个随机数 R1 。 2)Server Hello Server 端确

    2024年02月05日
    浏览(46)
  • 配置https---Nginx认证ssl证书

    nginx作为前端的负载均衡服务器已经很熟悉了,项目需要使用https安全的时候就需要认证证书了 dockerweb管理工具 Portainer 如果对docker不那么熟悉可以使用docker 第三方管理端 然后访问本地9000端口,登录后可以管理容器镜像 有了该工具可以直接进入容器查看日志等操作 nginx环境安装

    2024年01月19日
    浏览(50)
  • 基于tomcat的https(ssl)双向认证

            某个供应商服务需要部署到海外,如果海外多个地区需要部署多个服务,最好能实现统一登录,这样可以减轻用户的使用负担(不用记录一堆密码)。由于安全问题(可能会泄露用户数据),海外服务不能直连公司sso服务端,因此需要其他的方案解决安全问题。最终

    2024年02月20日
    浏览(44)
  • Openfeign和okHttp的https请求忽略ssl证书认证

    在通过feign和okhttp请求外部接口时,出现了以下问题: Servlet.service() for servlet [dispatcherServlet] in context with path [/xxxx] threw exception [Request processing failed; nested exception is feign.RetryableException: java.security.cert.CertificateException: No subject alternative DNS name matching www.xx.xx.cn found. executing GET htt

    2024年02月07日
    浏览(50)
  • SpringBoot整合自签名SSL证书,转变HTTPS安全访问(单向认证服务端)

    HTTP 具有相当优秀和方便的一面,然而 HTTP 并非只有好的一面,事物皆具两面性,它也是有不足之处的。例如: 通信使用明文(不加密),内容可能会被窃听。 不验证通信方的身份,因此有可能会遭遇伪装。 无法证明报文的完整性,所以有可能会遭篡改等。 因HTTP有存在通信

    2024年02月06日
    浏览(59)
  • springboot前后端分离项目配置https接口(ssl证书)

    本记录操作方法vue.js项目使用nginx代理部署,后端springboot正常部署 前端使用443端口,后端使用8080端口 全部接口使用https vue.js配置axios相对路径,好处:请求代理再nginx.conf中配置,无需重新修改代码 request和response 拦截器根据具体项目要求进行配置 在/usr/front/vue下创建Dockerf

    2024年02月03日
    浏览(43)
  • 解决dotnet调用https请求被中止未能创建SSL/TLS安全通道

    环境:dotnet4.7.2/winserver2012 调用https出现请求被中止,未能创建SSL/TLS安全通道 自定义SetCertificatePolicy 函数,在建立http连接之前调用 SetCertificatePolicy 函数。 请求被中止: 未能创建 SSL/TLS 安全通道 英文搜索 : the request was aborted could not create ssl/tls (net 4.6) statckoverflow 上面大多答

    2024年02月16日
    浏览(42)
  • Java安全——SSL和HTTPS

    SSL和HTTPS SSL提供了在TCP套接字之上的对数据进行加密的方法,也是HTTPS协议的基础 利用JSSE(java安全套接字扩展包)可以像处理协议一样创建和使用SSL套接字,从而支持HTTPS协议 SSL和tcp套接字之间的紧密关系,本身并不是一个加密引擎,但确是Internet上广泛使用的加密技术。 SS

    2024年02月15日
    浏览(52)
  • Elastic stack8.10.4搭建、启用安全认证,启用https,TLS,SSL 安全配置详解

    ELK大家应该很了解了,废话不多说开始部署 kafka在其中作为消息队列解耦和让logstash高可用 kafka和zk 的安装可以参考这篇文章 深入理解Kafka3.6.0的核心概念,搭建与使用-CSDN博客 需要 elasticsearch-8.10.4 logstash-8.10.4 kibana-8.10.4 kafka_2.13-3.6.0 apache-zookeeper-3.9.1-bin.tar filebeat-8.10.4-linux-

    2024年02月04日
    浏览(43)
  • QtWebApp开发https服务器,完成客户端与服务器基于ssl的双向认证,纯代码操作

    引言:所谓http协议,本质上也是基于TCP/IP上服务器与客户端请求和应答的标准,web开发中常用的http server有apache和nginx。Qt程序作为http client可以使用QNetworkAccessManager很方便的进行http相关的操作。 Qt本身并没有http server相关的库 ,也许是因为很少有这种需求吧。但是实际开发中

    2024年02月14日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包