Java/SpringBoot实现https请求-程序员宅基地

技术标签: Java  java  网络  http  https  


提示:以下是本篇文章正文内容,下面案例可供参考

一、https和http

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。

为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密

1.1 HTTP和HTTPS的基本概念

HTTP: 是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。

HTTPS: 是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

1.2 HTTP与HTTPS有什么区别?

HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

HTTPS和HTTP的区别主要如下:

  1. https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
  2. http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
  3. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  4. http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

1.3 HTTPS的工作原理

我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。
在这里插入图片描述
客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤,如图所示。

(1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。

(2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。

(3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。

(4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。

(5)Web服务器利用自己的私钥解密出会话密钥。

(6)Web服务器利用会话密钥加密与客户端之间的通信。

在这里插入图片描述

1.4 HTTPS的优点和缺点

优点:
尽管HTTPS并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但HTTPS仍是现行架构下最安全的解决方案,主要有以下几个好处:

(1)使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;

(2)HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。

(3)HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。

(4)谷歌曾在2014年8月份调整搜索引擎算法,并称“比起同等HTTP网站,采用HTTPS加密的网站在搜索结果中的排名将会更高”。

缺点:

虽然说HTTPS有很大的优势,但其相对来说,还是存在不足之处的:

(1)HTTPS协议握手阶段比较费时,会使页面的加载时间延长近50%,增加10%到20%的耗电;

(2)HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;

(3)SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。

(4)SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗。

(5)HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行。

二、SpringBoot实现Https请求

2.1 证书的获取

一般有两种方式:
1)使用cmd在本地生成自签名证书。

// 使用JDK工具keytool生成自签名证书(秘钥库)
keytool -genkey -alias tomcat -keyalg RSA -keystore ./server.keystore 

按照提示进行操作,创建完成后,可在用户根目录查看生成的keystore文件

输入密钥库口令:123456
再次输入新口令:123456
您的名字与姓氏是什么?
  [Unknown]:  kaibowang
您的组织单位名称是什么?
  [Unknown]:  yuxuelian
您的组织名称是什么?
  [Unknown]:  yuxuelian
您所在的城市或区域名称是什么?
  [Unknown]:  chengdu
您所在的省/市/自治区名称是什么?
  [Unknown]:  chengdushi
该单位的双字母国家/地区代码是什么?
  [Unknown]:  china
CN=kaibowang, OU=yuxuelian, O=yuxuelian, L=chengdu, ST=chengdushi, C=china是否正确?
  []:  y

输入 <tomcat> 的密钥口令
        (如果和密钥库口令相同, 按回车):
再次输入新口令:

Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore C:\Users\Administrator\.keystore -destkeystore C:\Users\Administrator\.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

在这里插入图片描述

2)向权威机构购买由该机构签名认证的证书(CA证书)。

阿里云申请免费的个人证书

阿里申请步骤示例:
①点击控制台
在这里插入图片描述
②展示左侧菜单,输入证书,选择SSL(应用安全)
在这里插入图片描述
③进入页面,点击(右上角)购买证书
在这里插入图片描述
④选择基本配置(重点)

  • 选择品牌 Symantec
    在这里插入图片描述

  • 选择保护类型 1个域名
    在这里插入图片描述

  • 选择证书类型免费型DV SSL即可
    在这里插入图片描述

⑤点击立即购买,去支付完成购买
在这里插入图片描述
⑥按官方流程操作即可
在这里插入图片描述

2.2 将证书文件拷贝到SpringBoot工程最高层级的根目录下

和pom.xml同级目录下

2.3 在SpringBoot工程的application.yml文件中添加ssl配置

server:
  port: 8080 ## 后台服务对外端口
  ssl:
    key-store: server.keystore ##秘钥库文件名称,即上面生成的自签名证书
    key-store-password: 123456 ## 生成秘钥库文件的密码
    key-store-type: JKS ## 秘钥库类型(JKS为jdk的keytool工具默认生成的秘钥库类型)
    key-alias: tomcat ## 秘钥别名
    enabled: true

运行SpringBoot工程,使用 https://localhost:10080/xxxx 即可。

拓展:
http访问自动转https访问,向spring容器中注入两个Bean,代码如下

    @Bean
    public Connector connector(){
    
        Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(80);
        connector.setSecure(false);
        connector.setRedirectPort(443);
        return connector;
    }

    @Bean
    public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector){
    
        TomcatServletWebServerFactory tomcat=new TomcatServletWebServerFactory(){
    
            @Override
            protected void postProcessContext(Context context) {
    
                SecurityConstraint securityConstraint=new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection=new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(connector);
        return tomcat;
    }

三、Java项目实现Https请求

3.1 创建证书管理器类

import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
 
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
 
public class MyX509TrustManager implements X509TrustManager{
    
 
    X509TrustManager sunJSSEX509TrustManager; 
	
    MyX509TrustManager(String keystoreFile,String pass) throws Exception {
     
        KeyStore ks = KeyStore.getInstance("JKS"); 
        ks.load(new FileInputStream(keystoreFile), pass.toCharArray()); 
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509", "SunJSSE"); 
        tmf.init(ks); 
        TrustManager tms [] = tmf.getTrustManagers(); 
        for (int i = 0; i < tms.length; i++) {
     
            if (tms[i] instanceof X509TrustManager) {
     
                sunJSSEX509TrustManager = (X509TrustManager) tms[i]; 
                return; 
            } 
        } 
        throw new Exception("Couldn't initialize"); 
    }
	
    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    
	try {
     
            sunJSSEX509TrustManager.checkClientTrusted(chain, authType); 
        } catch (CertificateException excep) {
     
        	excep.printStackTrace();
        }	
    }
 
    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    
	try {
     
            sunJSSEX509TrustManager.checkServerTrusted(chain, authType); 
        } catch (CertificateException excep) {
     
        	excep.printStackTrace();
        }		
    }
 
    @Override
    public X509Certificate[] getAcceptedIssuers() {
    
	return sunJSSEX509TrustManager.getAcceptedIssuers();
    }
 
}

3.2 工具类:

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
 
public class NullHostNameVerifier implements HostnameVerifier{
    
	
    @Override
    public boolean verify(String hostname, SSLSession session) {
    
        return true;
    }
}

3.3 调用测试

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.URL;
 
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
 
public class HttpsCaTest {
    
 
    public static void main(String[] args) throws Exception {
    	
	String keystoreFile = "D:\\tomcat.keystore";
    	String keystorePass = "ldysjhj";
    	//设置可通过ip地址访问https请求
    	HttpsURLConnection.setDefaultHostnameVerifier(new NullHostNameVerifier());
    	// 创建SSLContext对象,并使用我们指定的信任管理器初始化 
    	TrustManager[] tm = {
     new MyX509TrustManager(keystoreFile,keystorePass) }; 
    	SSLContext sslContext = SSLContext.getInstance("TLS"); 
    	sslContext.init(null, tm, new java.security.SecureRandom()); 
    	// 从上述SSLContext对象中得到SSLSocketFactory对象 
    	SSLSocketFactory ssf = sslContext.getSocketFactory();
    	String urlStr = "https://192.168.1.10/login_queryLkBySfmc.htm";
    	URL url = new URL(urlStr);
    	HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); 
    	con.setSSLSocketFactory(ssf); 
    	con.setRequestMethod("POST"); // 设置以POST方式提交数据
    	con.setDoInput(true); // 打开输入流,以便从服务器获取数据
    	con.setDoOutput(true);// 打开输出流,以便向服务器提交数据
    	//设置发送参数
        String param = "sfmc=测试";
        PrintWriter out = new PrintWriter(new OutputStreamWriter(con.getOutputStream(),"UTF-8"));
        out.print(param);          
        out.flush();
        out.close();
        //读取请求返回值
	InputStreamReader in = new InputStreamReader(con.getInputStream(),"UTF-8");
	BufferedReader bfreader = new BufferedReader(in);
	String result = "";
	String line = "";
	while ((line = bfreader.readLine()) != null) {
    
	    result += line;
	}
	System.out.println("result:"+result);
    }
 
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42347616/article/details/120653643

智能推荐

四、数学建模之图与网络模型_图论与网络优化数学建模-程序员宅基地

文章浏览阅读912次。(1)图(Graph):图是数学和计算机科学中的一个抽象概念,它由一组节点(顶点)和连接这些节点的边组成。图可以是有向的(有方向的,边有箭头表示方向)或无向的(没有方向的,边没有箭头表示方向)。图用于表示各种关系,如社交网络、电路、地图、组织结构等。(2)网络(Network):网络是一个更广泛的概念,可以包括各种不同类型的连接元素,不仅仅是图中的节点和边。网络可以包括节点、边、连接线、路由器、服务器、通信协议等多种组成部分。网络的概念在各个领域都有应用,包括计算机网络、社交网络、电力网络、交通网络等。_图论与网络优化数学建模

swagger使用map传参和实体传参编写注释_swagger页面get请求传map参数怎么写-程序员宅基地

文章浏览阅读1.7w次,点赞2次,收藏20次。@AutoLog(value = "web首页-地图显示按行政区划")@ApiOperation(value="web首页-地图显示按行政区划")@ApiImplicitParams({@ApiImplicitParam(paramType = "query",name = "orgType",value ="行政等级",dataType ="String"), ..._swagger页面get请求传map参数怎么写

【进阶版】机器学习之神经网络与深度学习基本知识和理论原理(07)_深度随机配置网络-程序员宅基地

文章浏览阅读931次。机器学习算法知识、数据预处理、特征工程、模型评估——原理+案例+代码实战机器学习之Python开源教程——专栏介绍及理论知识概述机器学习框架及评估指标详解Python监督学习之分类算法的概述数据预处理之数据清理,数据集成,数据规约,数据变化和离散化特征工程之One-Hot编码、label-encoding、自定义编码卡方分箱、KS分箱、最优IV分箱、树结构分箱、自定义分箱特征选取之单变量统计、基于模型选择、迭代选择机器学习八大经典分类万能算法——代码+案例项目开源、可直接应用于毕设+科研项目。_深度随机配置网络

python logging模块“另一个程序正在使用此文件,进程无法访问。”问题解决办法...-程序员宅基地

文章浏览阅读2.7k次。在多进程下使用python的logging模块,经常会遇到“另一个程序正在使用此文件,进程无法访问。”的错误。解决办法: https://github.com/Preston-Landers/concurrent-log-handlerpip install concurrent-log-handler To use this module from a logging config..._logging roatingfilehander 另一个程序正在使用此文件,进程无法访问

SPA与DPA 攻击【转】-程序员宅基地

文章浏览阅读624次。转自:http://blog.sina.com.cn/s/blog_6cb58dbf0102v7ym.htmlSPASPA是一种直接解释能量消耗测定值的技术。系统消耗能量的大小随微处理器执行的指令不同而不同, 当微处理器在对加密算法的不同部分执行运算时, 能量消耗变化有的会很明显。借助这种特征, 攻击者能区分出单条指令, 达到破解算法的目的。DPA..._spa攻击

python 对话框的创建及调用_Python使用tkinter界面编程中对话框样式汇总-程序员宅基地

文章浏览阅读625次。在GUI编程中,对话框是用户交互和检索信息的重要控件。今天,我们对tkinter中常用的对话框进行汇总。tkinter模块的子模块messagebox、filedialog、colorchooser、simpledialog中包括了一些常用的预定义好的对话框,当然也可以通过继承Toplevel创建自定义的对话框。如果对于界面显示没有太严苛的要求的话,建议还是使用预定义的对话框,无论从功能还是容错机..._位于tkinter模块中的子模块___ 、___ 、___ 和___ ,包括通用 的预定义对话框;用户

随便推点

爬取唐诗-程序员宅基地

文章浏览阅读843次。首先我们打开唐诗三百首网页1 http://www.gushiwen.org/gushi/tangshi.aspx目标分析:1、爬取网页七大板块:五言绝句,七言绝句,五言律诗,七言律诗,五言古诗,七言古诗,乐府。2、爬取每个板块的所有古诗。3、爬取每个古诗词内容。网页详情如下:我们很容易就能发现,每一个分类都是包裹在:1 <div i..._获取唐诗三百首接口

Laravel学习:请求到响应的生命周期-程序员宅基地

文章浏览阅读93次。Laravel请求到响应的整个执行过程,主要可以归纳为四个阶段,即程序启动准备阶段、请求实例化阶段、请求处理阶段、响应发送和程序终止阶段。程序启动准备阶段服务容器实例化服务容器的实例化和基本注册,包括了服务容器本身注册、基础服务提供者注册、核心类别名注册和应用的基本路径注册。注册的服务只是具体的类名,是通过反射机制来实例化对象,并且..._laravel new client() 响应时长

思科 下一跳_二层交换机下一跳命令-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏6次。命令如下 仅供参考A :Router>enable Router#conf terminal Enter configuration commands, one per line. End with CNTL/Z.Router(config)#interface gigabitEthernet 0/0Router(config-if)#ip address 192.168.1..._二层交换机下一跳命令

IFeatureClass接口_list<ifeatureclass>-程序员宅基地

文章浏览阅读3.7k次。IFeatureClass用于访问控制要素类行为和属性的成员IFeatureClass接口是获取和设置要素类属性的主要接口。例如,使用IFeatureClass接口获取要素类类型、获取满足查询条件的要素数目或在要素类中创建新要素。IFeatureClass接口继承了IObjectClass接口。成员AddField 向这个类中添加一个字段。AddIndex _list

利用Mysql into outfile给网站留后门-程序员宅基地

文章浏览阅读9.6k次。Mysql into outfile使用Mysql into outfile语句,可以方便导出表格的数据。同样也可以生成某些文件。因此有些人会利用sql注入生成特定代码的文件,然后执行这些文件。将会造成严重的后果。Mysql into outfile 生成PHP文件SELECT 0x3C3F7068702073797374656D28245F524551554553545B636D645D293B3

商业智能软件对比评测: FineBI 和 Tableau -程序员宅基地

文章浏览阅读358次。FineBI和Tableau是比较好的自助式商业智能软件,功能都很强大,是企业数据可视化不可或缺的利器,但两款产品还是有非常大的区别的,例如Tableau的功能全面且深入,更适合专业的数据分析人员,而FineBI则是面向普通的业务人员,数据分析过程更人性化,更简单和易用,并为企业提供了全面的数据管理和用户管理策略。下面对这两款商业智能软件做个对比评测。一、产品理念FineBI是帆软公司推出的自助..._centos7安装finebi

推荐文章

热门文章

相关标签