原创

SpringBoot 系列教程(五十六):SpringBoot配置SSL证书使用HTTPS访问

版权声明: 本文为博主原创文章,转载请注明原文出处!
本文链接:https://thinkingcao.blog.csdn.net/article/details/102967920

一、前言

       日常项目开发过程中,测试环境和生产环境大多数使用HTTP访问服务,从浏览器上可以看到,左上角一般会显示不安全提示,好在为了安全层面着想,现在生产环境基本都会使用HTTPS来访问服务,这样安全性较高,传统的SSM架构,部署web服务都是托管与外部Tomcat容器,那么配置HTTPS访问也是需要从类似于阿里云、腾讯云等等购买SSL安全证书后放到Tomcat下面,然后配置访问,方可支持HTTPS来访问,至少我项目部署生产环境是这么做的。

二、SpringBoot如何支持HTTPS

        从传统SSM架构演变为今天的SpringBoot快速开发、SpringBoot默认内嵌了Tomcat,是在SpringBoot启动时,使用Java代码New出来一个Tomcat,因此SpringBoot默认就是使用Jar部署,当然也支持外部Tomcat部署,不过大多数都是使用默认的jar部署,这样更方便,那打成jar部署如何配置SSL证书,使得SpringBoot项目运行时也要同时支持HTTPS和HTTPS访问呢,当然是在application.yml或者application.properties里配置了。

三、生成SSL证书

  • 专业的SSL证书较为昂贵,可以在腾讯云或者阿里云上申请免费的SSL证书。
  • 如果只是做简单的demo,可以使用java自带的keytool工具生成SSL证书

一、从阿里云申请免费的SSL证书,有效期默认是一年

 

二、使用JDK自带的keytool生成证书

  本次为了开发测试SpringBoot项目使用HTTPS来访问,我们暂且就使用JDK自带工具生成一个证书文件;

1、比如就我的JDK安装目录来说,我的JDK安装目录是:D:\path\developTool\JDK,在该路径下打开CMD命令行,输入以下命令来生成我们想要的证书文件:

首先先找到jdk的bin目录:

然后命令行进入文件对应的路径,输入如下命令:

keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650

参数解释

-genkey: 生成SSL证书
-alias: 证书别名
-storetype: 秘钥仓库类型
-keyalg: 生成证书算法
-keysize: 证书大小
-keystore: 生成证书保存路径,也是证书名称
-validity: 证书有效期

当在CMD命令行输入上述命令,然后执行完上述步骤后,在当前目录D:\path\developTool\JDK下面将生成一个证书文件keystore.p12

四、Spring Boot项目配置SSL

1、创建SpringBoot项目,添加pom依赖

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.thinkingcao</groupId>
    <artifactId>springboot-https</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-https</name>
    <description>SpringBoot配置同时支持http和https</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

2、application.yml配置

在配置文件application.yml中添加如下内容

server:
  # https加密端口
  port: 443
  # SSL证书相关配置
  ssl:
    # 证书路径
    key-store: classpath:keystore.p12
    # 证书秘钥
    key-store-password: 123456
    # 证书类型
    key-store-type: PKCS12
    # 证书别名
    key-alias: tomcat
#HTML页面配置
spring:
  thymeleaf:
    prefix: classpath:/templates/
    suffix: .html

3、配置Tomcat,支持HTTP请求自动转成HTTPS请求

 由于Tomcat是内嵌,使用Java配置Tomcat如下: TomcatServerConfig 

package com.thinkingcao.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.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * <pre>
 * @desc: 重定向http到https ,因为我们原来的请求方式都是http, 现在我们想使用https,就需要做一下重定向,不能跟之前的冲突。
 * @author: cao_wencao
 * @date: 2019-11-09 0:38
 * @version: 1.0
 * </pre>
 */
@Configuration
public class TomcatServerConfig {

    @Bean
    public TomcatServletWebServerFactory servletContainer() {

        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(initiateHttpConnector());
        return tomcat;
    }

    /**
     * 让我们的应用支持HTTP是个好想法,但是需要重定向到HTTPS,
     * 但是不能同时在application.properties中同时配置两个connector,
     * 所以要以编程的方式配置HTTP connector,然后重定向到HTTPS connector
     *
     * @return Connector
     */
    private Connector initiateHttpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(80); // http端口
        connector.setSecure(false);
        connector.setRedirectPort(443); // application.properties中配置的https端口
        return connector;
    }
}

4、创建测试页面Login.jsp,放到templates目录下面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录首页</title>
</head>
<body>
<h2><p style="color: green; font-weight: bold">测试SpringBoot配置同时支持http和https</p></h2>
</body>
</html>

5、创建跳转登录页面LoginController

package com.thinkingcao.springboothttps.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * <pre>
 * @desc:
 * @author: cao_wencao
 * @date:2019-11-08 22:48
 * @version: 1.0
 * </pre>
 */
@Controller
public class LoginController {

    @RequestMapping("/login")
    public String index() {
        return "login";
    }
}

6、将上面生成的证书文件keystore.p12放到SpringBoot项目的Resource目录下

7、完整项目目录结构

五、测试Spring Boot项目HTTPS访问

1、启动项目

 发现控制台打印了80端口和443端口都启动了

2、访问:https://localhost/login  和http://localhost/login  最后都会跳转到https://localhost/login路径上

因为证书是我们自己使用JDK自带的生成的,很多不被浏览器认可,不过使用HTTPS访问SpringBoot项目是没问题的,不过上线的项目,一般都是去阿里云、腾讯云等等申请一个正规的SSl证书

 

3、搜狗浏览器认可该证书

六、项目源码

 源码:https://github.com/Thinkingcao/SpringBootLearning/tree/master/springboot-https

 

 

文章最后发布于: 2019-11-08 11:18:26
展开阅读全文
0 个人打赏
私信求帮助

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览