`
huangyongxing310
  • 浏览: 494631 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Https 在spring-boot应用例子

阅读更多
Https 在spring-boot应用例子


Https工原理(以浏览器-服务器为例子)
1.浏览器发送Https请求
2.服务器接收到Https请求,返回CA数字证书(里面包含有公钥、服务器基本信息、CA签名、认证机构基本信息(颁发证书机构)等)
3.浏览器接收到数字证书,得到数字证书颁发证书机构信息,浏览器检测这个颁发证书机构的证书是否可以信任(CA一般在浏览器中都信任),就是是否在信任认证机构列表中,不在列表中就弹出不信任提示框。
4.如果信任就用颁发证书机构的公钥解密证书中的签名,并用数字证书中的签名算法重新计算数字证书的信息的签名,看这个签名是否一致,一致表明信息没有改变过,这个证书确实是可以信任的。
5.浏览器再对比现在访问的域名(URL前部)是否要数字证书中的域名对应上,如果不对上也会弹出不信任提示框。
6.浏览器信任后会随机生成一个临时密码串(每次建立随机生成),用数字证书中的公钥加密这个临时密码串,发送到服务器。
7.服务器接收到加密的临时密码串后,用服务器的私钥解密,得到临时密码串。响应浏览器。
8.浏览器接收到响应后,https连接建立,浏览器发送请求到服务器开始。
9.https连接建立后,浏览器发送的所有信息(TCP包中的数据)都是以临时密码串进行了加密的。服务器也是用这个临时密码串进行解密还原请求信息。


数字证书
1.数字证书是一个包含有公钥、服务器基本信息、认证机构基本信息(颁发证书机构),前面所有内容的信息摘要用CA私钥加密后的签名等组成的一个文件或一串字符串信息。
数字证书到底包含
(1).持有者姓名(Common Name)
(2).发证机关(Issuer)
(3).有效日期(Validity)
(4).证书持有人的公钥(Subject’s Public Key Info)
(5).扩展信息 (Extension)
(6).用发证机关对该证书的数字签名(Certificate Signature)


数字签名
1.就是对一串字符串进行摘要算法,这个过程是不可逆的(信息部分选取的),用于验证数据是否发生过更改用的。
2.在对所有参数后加一个自己的参数(相当于密码了),再进行计算那别人就不可能算出你一样的摘要信息了(自己的参数(相当于密码了)在别人不知的情况下)

//数字签名算法例子
package com.proserver.common.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class HashAlgorithms {
    public static String Encrypt(String strSrc, String encName) {
        MessageDigest md = null;
        String strDes = null;

        byte[] bt = strSrc.getBytes();
        try {
            if (encName == null || encName.equals("")) {
                encName = "SHA-256";
            }
            md = MessageDigest.getInstance(encName);
            md.update(bt);
            strDes = bytes2Hex(md.digest()); // to HexString
        } catch (NoSuchAlgorithmException e) {
            return null;
        }
        return strDes;
    }

    public static String bytes2Hex(byte[] bts) {
        String des = "";
        String tmp = null;
        for (int i = 0; i < bts.length; i++) {
            tmp = (Integer.toHexString(bts[i] & 0xFF));
            if (tmp.length() == 1) {
                des += "0";
            }
            des += tmp;
        }
        return des;
    }
}



SSL全称是 Secure Sockets Layer,它是一种间于传输层(比如TCP/IP)和应用层(比如HTTP)的协议。
1.对TCP数据包里的数据信息进行加密的。


数字证书生成过程
keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
1.生成的keystore.p12里面的包含了数字证书、私钥的,程序从这个文件里面取数字证书和私钥。
2.p12是存储这些信息的一类文件类型。

在工程目录终端输入
keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
按提示输入相关的信息,到最后就会生成一个keystore.p12的文件了。







例子代码:
application.properties
#Server
#server.port=8090
#LOGGING
logging.pattern.level=INFO
server.port:8443
server.ssl.key-store: classpath:keystore.p12
server.ssl.key-store-password:123456
server.ssl.keyStoreType: PKCS12
server.ssl.keyAlias: tomcat



package com.cesmart;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ComponentScan;

@EnableAutoConfiguration
@ComponentScan(basePackages = "com.cesmart") // 扫描那些包得到bean.@ComponentScan({"com.teradata.notification","com.teradata.dal"})
//@EnableSwagger2             //启动swagger注解
public class Application {
	public static void main(String[] args) {
		ApplicationContext applicationContext = SpringApplication.run(Application.class, args);
	}
}



package com.cesmart.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.google.common.base.Predicates;

import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration//定义为spring boot 的配置文件
@EnableSwagger2//启动swagger注解
public class Swagger2 {
	public static final String SWAGGER_SCAN_BASE_PACKAGE = "com.cesmart.controller";

	@Bean(value="createRestApi")
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
        		.groupName("test1")
        		.pathMapping("/")
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage(SWAGGER_SCAN_BASE_PACKAGE))
               .paths(Predicates.or(PathSelectors.regex("/webTest2/.*")))
                .build();

        //groupName,分组名字
        //pathMapping,映射路径(会加到URL前面组成新的路径,如:"/xing/WebTest/webTest",(pathMapping("/xing")))
        //apiInfo,API信息描述
        //select, 选择那些路径和api会生成document
        //apis,扫描那些包,RequestHandlerSelectors.any()表示对所有api进行监控
        //paths,匹配那些路径,PathSelectors.any()表示所有路径,
    }

    @Bean(value="createRestApi2")
    public Docket createRestApi2() {
        return new Docket(DocumentationType.SWAGGER_2)
        		.groupName("test2")
        		.pathMapping("/")
                .apiInfo(apiInfo2())
                .select()
                .apis(RequestHandlerSelectors.basePackage(SWAGGER_SCAN_BASE_PACKAGE))
               .paths(Predicates.or(PathSelectors.regex("/webTest/.*")))
                .build();
    }


    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Spring Boot中使用Swagger2构建RESTful APIs")
                .description("更多Spring Boot相关文章请关注:http://blog.didispace.com/")
                .termsOfServiceUrl("http://blog.didispace2.com/")
                .contact("程序猿DD")
                .version("1.0")
                .license("license")
                .licenseUrl("licenseUrl")
                .build();

        	//title,标题,在页面顶部显示
        	//description,描述,在页面顶部显示
        	//termsOfServiceUrl,
        	//contact,显示“Created by + contact”,在页面顶部显示
	        //version,API版本,,在页面顶部显示
	        //license,版权
    }

    private ApiInfo apiInfo2() {
        return new ApiInfoBuilder()
                .title("Spring Boot中使用Swagger2构建RESTful APIs")
                .description("更多Spring Boot相关文章请关注:http://blog.didispace.com/")
                .termsOfServiceUrl("http://blog.didispace2.com/")
                .contact("程序猿DD")
                .version("1.0")
                .license("license")
                .licenseUrl("licenseUrl")
                .build();
    }

}


@RestController
@Api(value = "WebTest", description = "有关于Swagger2操作")
@RequestMapping(value = "/webTest")
// 用在类上,说明该类的作用
// value,显示在类中的说明
// description,类中的说明
// 显示形式:“value:description”,如上面显示为"WebTest:有关于Swagger2操作"
public class WebTest {
	@ApiOperation(value = "接口说明", notes = "接口发布说明", response = String.class)
	// 用在方法上,说明方法的作用
	// 显示在方法说明中,显示notes
	// response,接口返回参数类型
	// value = "接口说明",
	// notes = "接口发布说明"
	@ApiImplicitParams({
			@ApiImplicitParam(paramType = "path", required = true, name = "test", dataType = "String", value = "456"),
			@ApiImplicitParam(paramType = "path", required = true, name = "test2", dataType = "String", value = "789") })
	// @ApiImplicitParam,表示一个参数的描述,与请求参数有关系
	// paramType,参数放在哪个地方
	// required,参数是否必须传
	// name,参数名
	// dataType,参数类型(描述)
	// value,参数的意思(描述)
	@ApiParam
	@RequestMapping(value = "/webTest/{test}/{test2}", produces = "text/plain;charset=UTF-8", method = RequestMethod.GET)
	public String webTest(@PathVariable("test") String test, @PathVariable("test2") String test2) {
		System.out.println("webTest");
		System.out.println("test == " + test);
		System.out.println("test2 == " + test2);
		return "webTest";
	}

	@ApiOperation(value = "接口说明", notes = "接口发布说明", response = String.class)
	@ApiImplicitParams({
			@ApiImplicitParam(paramType = "query", required = true, name = "test", dataType = "String", value = "456"),
			@ApiImplicitParam(paramType = "query", required = true, name = "test2", dataType = "String", value = "789") })
	@RequestMapping(value = "/webTest2", produces = "text/plain;charset=UTF-8", method = RequestMethod.POST)
	public String webTest2(String test, String test2) {
		System.out.println("webTest");
		System.out.println("test == " + test);
		System.out.println("test2 == " + test2);
		return "webTest";
	}

	@ApiOperation(value = "接口说明", notes = "接口发布说明", response = String.class)
	@ApiImplicitParams({
			@ApiImplicitParam(paramType = "query", required = true, name = "name", dataType = "String", value = "456"),
			@ApiImplicitParam(paramType = "query", required = true, name = "value", dataType = "String", value = "789") })
	@RequestMapping(value = "/webTest3", produces = "text/plain;charset=UTF-8", method = RequestMethod.POST)
	public String webTest3(@ModelAttribute TestModel testModel) { // 这里要用@ModelAttribute,才不会出现testModel输入框
		System.out.println("testModel == " + testModel.toString());
		return "webTest";
	}
}



抓包软件:fiddler


参考(Spring Boot中启动HTTPS):http://blog.csdn.net/ro_wsy/article/details/51319963
参考(SpringBoot启用HTTPS协议):http://blog.csdn.net/enterys/article/details/52034250
参考(在Spring Boot中使用Https(应用参考这个)):http://www.cnblogs.com/xinzhao/p/4952856.html
参考(基于SpringBoot项目的https):http://www.cnblogs.com/badboyf/p/6145642.html
参考(5分钟内搞定 Tomcat 的 SSL 配置):https://www.oschina.net/question/12_23148
参考(Spring Boot基于Tomcat的HTTP和HTTPS协议配置,这个好):http://kchu.me/2015/08/19/Spring-Boot%E5%9F%BA%E4%BA%8ETomcat%E7%9A%84HTTP%E5%92%8CHTTPS%E5%8D%8F%E8%AE%AE%E9%85%8D%E7%BD%AE/

参考(ca证书的工作原理):http://wenda.tianya.cn/question/1d6e2990867fb734
参考(数字证书及CA的扫盲介绍):http://kb.cnblogs.com/page/194742/
参考(SSL 与 数字证书 的基本概念和工作原理):http://blog.csdn.net/jhonguy/article/details/7577729
参考(数字证书及其认证过程):http://blog.csdn.net/cyy089074316/article/details/9071951
参考(https原理:证书传递、验证和数据加密、解密过程解析):http://blog.csdn.net/clh604/article/details/22179907
参考(浏览器和服务器在基于https进行请求链接到数据传输过程中,用到了如下哪些技术):http://www.cnblogs.com/cloudml/p/4798876.html
参考(数字证书原理):http://www.2cto.com/article/201203/122095.html
参考(生成PKI公私密钥对及数字证书):http://openwares.net/misc/pki_key_pair_certificate.html
参考(keytool生成私钥、公钥、证书详解):http://blog.csdn.net/kexiuyi/article/details/52413133
参考(数字证书文件格式(cer和pfx)的区别):http://blog.csdn.net/xueyepiaoling/article/details/6524248
  • 大小: 49.8 KB
  • 大小: 25.1 KB
  • 大小: 36.9 KB
分享到:
评论

相关推荐

    pandas-1.3.5-cp37-cp37m-macosx_10_9_x86_64.zip

    pandas whl安装包,对应各个python版本和系统(具体看资源名字),找准自己对应的下载即可! 下载后解压出来是已.whl为后缀的安装包,进入终端,直接pip install pandas-xxx.whl即可,非常方便。 再也不用担心pip联网下载网络超时,各种安装不成功的问题。

    基于java的大学生兼职信息系统答辩PPT.pptx

    基于java的大学生兼职信息系统答辩PPT.pptx

    基于java的乐校园二手书交易管理系统答辩PPT.pptx

    基于java的乐校园二手书交易管理系统答辩PPT.pptx

    tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl

    tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl

    Android Studio Ladybug(android-studio-2024.2.1.10-mac.zip.002)

    Android Studio Ladybug 2024.2.1(android-studio-2024.2.1.10-mac.dmg)适用于macOS Intel系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/89954174 part2: https://download.csdn.net/download/weixin_43800734/89954175

    基于ssm框架+mysql+jsp实现的监考安排与查询系统

    有学生和教师两种角色 登录和注册模块 考场信息模块 考试信息模块 点我收藏 功能 监考安排模块 考场类型模块 系统公告模块 个人中心模块: 1、修改个人信息,可以上传图片 2、我的收藏列表 账号管理模块 服务模块 eclipse或者idea 均可以运行 jdk1.8 apache-maven-3.6 mysql5.7及以上 tomcat 8.0及以上版本

    tornado-6.1b2-cp38-cp38-macosx_10_9_x86_64.whl

    tornado-6.1b2-cp38-cp38-macosx_10_9_x86_64.whl

    Android Studio Ladybug(android-studio-2024.2.1.10-mac.zip.001)

    Android Studio Ladybug 2024.2.1(android-studio-2024.2.1.10-mac.dmg)适用于macOS Intel系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/89954174 part2: https://download.csdn.net/download/weixin_43800734/89954175

    基于MATLAB车牌识别代码实现代码【含界面GUI】.zip

    matlab

    基于java的毕业生就业信息管理系统答辩PPT.pptx

    基于java的毕业生就业信息管理系统答辩PPT.pptx

    基于Web的毕业设计选题系统的设计与实现(springboot+vue+mysql+说明文档).zip

    随着高等教育的普及和毕业设计的日益重要,为了方便教师、学生和管理员进行毕业设计的选题和管理,我们开发了这款基于Web的毕业设计选题系统。 该系统主要包括教师管理、院系管理、学生管理等多个模块。在教师管理模块中,管理员可以新增、删除教师信息,并查看教师的详细资料,方便进行教师资源的分配和管理。院系管理模块则允许管理员对各个院系的信息进行管理和维护,确保信息的准确性和完整性。 学生管理模块是系统的核心之一,它提供了学生选题、任务书管理、开题报告管理、开题成绩管理等功能。学生可以在此模块中进行毕业设计的选题,并上传任务书和开题报告,管理员和教师则可以对学生的报告进行审阅和评分。 此外,系统还具备课题分类管理和课题信息管理功能,方便对毕业设计课题进行分类和归档,提高管理效率。在线留言功能则为学生、教师和管理员提供了一个交流互动的平台,可以就毕业设计相关问题进行讨论和解答。 整个系统设计简洁明了,操作便捷,大大提高了毕业设计的选题和管理效率,为高等教育的发展做出了积极贡献。

    机器学习(预测模型):2000年至2015年期间193个国家的预期寿命和相关健康因素的数据

    这个数据集来自世界卫生组织(WHO),包含了2000年至2015年期间193个国家的预期寿命和相关健康因素的数据。它提供了一个全面的视角,用于分析影响全球人口预期寿命的多种因素。数据集涵盖了从婴儿死亡率、GDP、BMI到免疫接种覆盖率等多个维度,为研究者提供了丰富的信息来探索和预测预期寿命。 该数据集的特点在于其跨国家的比较性,使得研究者能够识别出不同国家之间预期寿命的差异,并分析这些差异背后的原因。数据集包含22个特征列和2938行数据,涉及的变量被分为几个大类:免疫相关因素、死亡因素、经济因素和社会因素。这些数据不仅有助于了解全球健康趋势,还可以辅助制定公共卫生政策和社会福利计划。 数据集的处理包括对缺失值的处理、数据类型转换以及去重等步骤,以确保数据的准确性和可靠性。研究者可以使用这个数据集来探索如教育、健康习惯、生活方式等因素如何影响人们的寿命,以及不同国家的经济发展水平如何与预期寿命相关联。此外,数据集还可以用于预测模型的构建,通过回归分析等统计方法来预测预期寿命。 总的来说,这个数据集是研究全球健康和预期寿命变化的宝贵资源,它不仅提供了历史数据,还为未来的研究和政策制

    基于微信小程序的高校毕业论文管理系统小程序答辩PPT.pptx

    基于微信小程序的高校毕业论文管理系统小程序答辩PPT.pptx

    基于java的超市 Pos 收银管理系统答辩PPT.pptx

    基于java的超市 Pos 收银管理系统答辩PPT.pptx

    基于java的网上报名系统答辩PPT.pptx

    基于java的网上报名系统答辩PPT.pptx

    基于java的网上书城答辩PPT.pptx

    基于java的网上书城答辩PPT.pptx

    婚恋网站 SSM毕业设计 附带论文.zip

    婚恋网站 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B

    基于java的戒烟网站答辩PPT.pptx

    基于java的戒烟网站答辩PPT.pptx

    基于微信小程序的“健康早知道”微信小程序答辩PPT.pptx

    基于微信小程序的“健康早知道”微信小程序答辩PPT.pptx

    机器学习(预测模型):自行车共享使用情况的数据集

    Capital Bikeshare 数据集是一个包含从2020年5月到2024年8月的自行车共享使用情况的数据集。这个数据集记录了华盛顿特区Capital Bikeshare项目中自行车的租赁模式,包括了骑行的持续时间、开始和结束日期时间、起始和结束站点、使用的自行车编号、用户类型(注册会员或临时用户)等信息。这些数据可以帮助分析和预测自行车共享系统的需求模式,以及了解用户行为和偏好。 数据集的特点包括: 时间范围:覆盖了四年多的时间,提供了长期的数据观察。 细节丰富:包含了每次骑行的详细信息,如日期、时间、天气条件、季节等,有助于深入分析。 用户分类:数据中区分了注册用户和临时用户,可以分析不同用户群体的使用习惯。 天气和季节因素:包含了天气情况和季节信息,可以研究这些因素对骑行需求的影响。 通过分析这个数据集,可以得出关于自行车共享使用模式的多种见解,比如一天中不同时间段的使用高峰、不同天气条件下的使用差异、季节性变化对骑行需求的影响等。这些信息对于城市规划者、交通管理者以及自行车共享服务提供商来说都是非常宝贵的,可以帮助他们优化服务、提高效率和满足用户需求。同时,这个数据集也

Global site tag (gtag.js) - Google Analytics