前言

  有时候我们需要使用https安全协议,本文记录在SpringBoot项目启用https

  生成证书

  自签名证书

  使用java jdk自带的生成SSL证书的工具keytool生成自己的证书

  1、打开cmd

  2、输入命令生成证书

keytool -genkeypair -alias tomcat_https -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore d:/tomcat_https.keystore -storepass 123456

    

    

    -alias 别名
    -keypass 指定生成密钥的密码
    -keyalg 指定密钥使用的加密算法(如 RSA)
    -keysize 密钥大小
    -validity 过期时间,单位天
    -keystore 指定存储密钥的密钥库的生成路径、名称
    -storepass 指定访问密钥库的密码

  域名型证书

  腾讯云域名型证书申请流程
  https://cloud.tencent.com/document/product/400/6814

  2020-01-10更新:今天使用内网穿透工具分给我们的二级域名去腾讯云申请证书,并记录一下

  1、登录腾讯云  -> 证书管理 -> 申请免费证书

  2、按照表单要求正确填写内容(填写的域名不需要www开头)

  3、使用“文件验证”的方式进行域名验证 (https://cloud.tencent.com/document/product/400/4142

  首先看文档说明:

  

  

  在springBoot项目中的static文件夹新建,然后把文件内容复制进去

  

   启动项目,访问 http://XXXX/.well-known/pki-validation/fileauth.txt,返回文件内容

  等待 CA 机构扫描审核、颁发证书  

  

  另外,内网穿透隧道协议类型要改成https,本地端口改成443,其他的不用变

  效果

  

  项目配置

  导入证书

  把生成的tomcat_https.keystore放在resources里(任意安全目录都可以)

  

  

  配置文件

#https默认端口:443,http默认端口:80
server.port=
server.http-port= #开启https,配置跟证书一一对应
server.ssl.enabled=true
#指定证书
server.ssl.key-store=classpath:tomcat_https.keystore
server.ssl.key-store-type=JKS
#别名
server.ssl.key-alias=tomcat_https
#密码
server.ssl.key-password=
server.ssl.key-store-password= spring.application.name=springboot-https

  测试与效果

  新增测试controller

package cn.huanzi.qch.springboothttps.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class HttpsController { @GetMapping("/hello")
public String hello() {
return "SpringBoot系列——启用https";
} }

  由于是自签名证书,浏览器不认可

  选择“高级”,选择继续访问即可

  成功访问

  客户端信任证书

  每次打开浏览器都阻止访问,很烦,因此需要导出.car文件证书,给客户端安装

keytool -keystore d:/tomcat_https.keystore -export -alias tomcat_https -file d:/server.cer

  双击安装,选择导入到受信任的跟证书颁发机构

  这样访问就不会再阻止了,但还是显示证书无效

  http强制跳转https

  注入TomcatServletWebServerFactory,监听http重定向到https

package cn.huanzi.qch.springboothttps.config;

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* http强制跳转https
*/
@Configuration
public class Http2Https { @Value("${server.port}")
private int sslPort;//https的端口 @Value("${server.http-port}")
private int httpPort;//http的端口 @Bean
public TomcatServletWebServerFactory servletContainerFactory() {
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);
}
};
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
//设置将分配给通过此连接器接收到的请求的方案
connector.setScheme("http"); //true: http使用http, https使用https;
//false: http重定向到https;
connector.setSecure(false); //设置监听请求的端口号,这个端口不能其他已经在使用的端口重复,否则会报错
connector.setPort(httpPort); //重定向端口号(非SSL到SSL)
connector.setRedirectPort(sslPort); tomcat.addAdditionalTomcatConnectors(connector);
return tomcat;
}
}

  效果

  后记

  部分代码参考:https://www.cnblogs.com/niumoo/p/11717657.html

  

  代码开源

  代码已经开源、托管到我的GitHub、码云:

  GitHub:https://github.com/huanzi-qch/springBoot

  码云:https://gitee.com/huanzi-qch/springBoot

SpringBoot系列——启用https的更多相关文章

  1. SpringBoot系列: SpringBoot Web项目中使用Shiro

    注意点有:1. 不要启用 spring-boot-devtools, 如果启用 devtools 后, 不管是热启动还是手工重启, devtools总是试图重新恢复之前的session数据, 很有可能 ...

  2. SpringBoot系列教程起步

    本篇学习目标 Spring Boot是什么? 构建Spring Boot应用程序 三分钟开发SpringBoot应用程序 本章源码下载 Spring Boot是什么? spring Boot是由Piv ...

  3. SpringBoot系列之日志框架使用教程

    目录 1.SpringBoot日志级别 1).日志级别简介 2).默认日志级别 3).配置日志级别 4).日志分组设置 2.SpringBoot日志格式设置 1).默认格式原理简介 2).默认日志格式 ...

  4. SpringBoot系列——admin服务监控

    前言 springboot项目部署起来后,如何实时监控项目的运行状况呢?本文记录使用springboot-admin对服务进行监控. springboot-admin介绍:https://codece ...

  5. SpringBoot系列——动态定时任务

    前言 定时器是我们项目中经常会用到的,SpringBoot使用@Scheduled注解可以快速启用一个简单的定时器(详情请看我们之前的博客<SpringBoot系列--定时器>),然而这种 ...

  6. SpringBoot系列——利用系统环境变量与配置文件的分支选择实现“智能部署”

    前言 通过之前的博客:SpringBoot系列——jar包与war包的部署,我们已经知道了如果实现项目的简单部署,但项目部署的时候最烦的是什么?修改成发布环境对应的配置!数据库连接地址.Eureka注 ...

  7. SpringBoot系列——Spring-Data-JPA(究极进化版) 自动生成单表基础增、删、改、查接口

    前言 我们在之前的实现了springboot与data-jpa的增.删.改.查简单使用(请戳:SpringBoot系列——Spring-Data-JPA),并实现了升级版(请戳:SpringBoot系 ...

  8. SpringBoot系列——Spring-Data-JPA

    前言 jpa是ORM映射框架,更多详情,请戳:apring-data-jpa官网:http://spring.io/projects/spring-data-jpa,以及一篇优秀的博客:https:/ ...

  9. SpringBoot系列——Spring-Data-JPA(升级版)

    前言 在上篇博客中:SpringBoot系列——Spring-Data-JPA:https://www.cnblogs.com/huanzi-qch/p/9970545.html,我们实现了单表的基础 ...

随机推荐

  1. idea 启动一直一直build以及勉勉强强的解决方案

    周日做了一个密匙解析的功能,在idea的springboot项目的该类上写了个main方法测试,当时一直提示build,没在意,直接打开eclipse上写 今天早上发现 idea启动springboo ...

  2. oracle函数 extract(c1 from d1)

    [功能]:日期/时间d1中,参数(c1)的值 [参数]:d1日期型(date)/日期时间型(timestamp),c1为字符型(参数) [参数表]:c1对应的参数表详见示例 [返回]:字符 [示例] ...

  3. Android 错误:IllegalStateException: Can not perform this action after onSaveInstanceState

    今天做Fragment切换.状态保存功能的时候,出现了这个错误: E/AndroidRuntime(12747): Caused by: java.lang.IllegalStateException ...

  4. java一般处理高并发的技术手段

    应对高并发的解决方案: 1.将压力放在数据库上面,添加行级锁. select * from table for update; 2.将压力放在应用程序上面,对方法加synchronized同步.

  5. Android Studio(三):设置Android Studio编码

    Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...

  6. H3C 快速以太网和千兆以太网

  7. .net core 控制台下使用HttpClientFactory封装

    HttpClientFactory封装,如有错误请指出,谢谢! using System; using System.Collections.Generic; using System.Net.Htt ...

  8. HDU 2602Bone Collector 01背包问题

    题意:给出一个t代表有t组数据,然后给出n,n代表有n种石头,v代表旅行者的背包容量,然后给出n种石头的价值和容量大小,求能带走的最大价值 思路:01背包问题,每种石头只有拿与不拿两种状态.(其实我是 ...

  9. Spark1.6.1 MLlib 特征抽取和变换

    Spark1.6.1 MLlib 特征抽取和变换 1 TF-IDF TF-IDF是一种特征向量化方法,这种方法多用于文本挖掘,通过算法可以反应出词在语料库中某个文档中的重要性.文档中词记为t,文档记为 ...

  10. [转]Win10下安装Linux子系统

    工作以来一直DotNet系偏C/S, 接触Web开发的时间也不长, 现在主要偏向Web全栈方向, 一直对Linux系统心生向往, 夜深了娃睡了, 打开老旧的笔记本来折腾一下. 准备工作 控制面板 &g ...