SpringBoot使用JKS或PKCS12证书实现https

SpringBoot使用JKS或PKCS12证书实现https

生成JKS类型的证书

可以利用jdk自带的keytool工具来生成证书文件,
默认生成的是JKS证书
cmd命令如下: 执行如下命令,并按提示填写证书内容,最后会生成server.keystore文件

keytool -genkey tomcat -keyalg RSA -keystore ./server.keystore

SpringBoot使用JKS或PKCS12证书实现https_第1张图片

在springboot中配置这个JKS证书

需要在application.yml或application.properties配置文件里
配置server.ssl相关配置如下:

server:
  port: 443  #https默认访问端口
  servlet:
    context-path: /demo
    session:
      timeout: 30m  #默认会话过期时间30分钟
    encoding:
      enabled: true
      charset: UTF-8
      force: true
  tomcat:
    uri-encoding: UTF-8
  ssl:
    # 证书存放的位置
    key-store: 'classpath:server.keystore'
    # 证书别名
    key-alias: tomcat
    # 证书类型
    key-store-type: JKS
    # 证书密码
    key-store-password: 123456

生成PKCS12类型的证书

keytool工具可以将刚刚生成的JKS证书升级为PKCS12类型的证书,

PKCS12类型的证书是目前行业标准格式。

升级命令如下,执行该命令后会生把之前的证书重命名为server.old.keystore,然后生成新的证书文件server.keystore

keytool -importkeystore -srckeystore ./server.keystore -destkeystore ./server.keystore -deststoretype pkcs12

SpringBoot使用JKS或PKCS12证书实现https_第2张图片

在springboot中配置PKCS12证书

需要在application.yml或application.properties配置文件里
配置server.ssl相关配置如下:

server:
  port: 443  #https默认访问端口
  servlet:
    context-path: /demo
    session:
      timeout: 30m  #默认会话过期时间30分钟
    encoding:
      enabled: true
      charset: UTF-8
      force: true
  tomcat:
    uri-encoding: UTF-8
  ssl:
    # 证书存放的位置
    key-store: 'classpath:server.keystore'
    # 证书别名
    key-alias: tomcat
    # 证书类型
    key-store-type: PKCS12
    # 证书密码
    key-store-password: 123456

配置tomcat连接器实现同时使用https和http访问

需要在springboot中新建一个配置类,配置tomcat里的http连接器

代码如下:


package cn.test;

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;

@Configuration
public class HttpConnectorConfig {


    /**
     * 配置http连接器
     * 当访问80端口时,自动重定向到443端口
     * 即访问http时,自动重定向到https端口
     * @return Connector
     */
    public Connector getHttpConnector(){
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setSecure(false);
        connector.setPort(80);
        connector.setRedirectPort(443);
        return connector;
    }

    @Bean
    public TomcatServletWebServerFactory tomcatServletWebServerFactory(){
        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(getHttpConnector());
        return tomcat;
    }






}

以上操作配置完成后,启动springboot项目

可以观察到控制台已经启用了https和http这2种访问端口

[main] [] o.s.b.w.e.t.TomcatWebServer [TomcatWebServer.java : 220] Tomcat started on port(s): 443 (https) 80 (http) with context path '/demo'

打开浏览器测试

访问 http://localhost/demo/home

浏览器会重定向到 https://localhost/demo/home

请添加图片描述

你可能感兴趣的:(JavaWeb笔记,SpringBoot技术笔记,spring,boot,https,后端)