Spring boot 配置 SSL证书

背景

如今在作的项目,一部分功能时创建在小程序上的,因此就不得不面临一个问题,就是小程序在发起请求,请求后台的时候,只能使用https,会对服务器的域名进行https证书校验,因此,咱们就不得不去考虑配置证书的问题。web

这里须要先声明一下,因为我这里尚未一个域名证书,因此使用的是本地 自签证书自签证书只能在开发的时候使用,一旦小程序上线,证书将会失效。
你们能够经过各类途径获取到证书,而后配置的过程基本一致,本身配置的时候注意替换就行了。

自签证书

为了开发试验,咱们须要本地生成一个自签证书。咱们直接使用JDK自带的keytool工具来生成证书。spring

首先先找到jdk的bin目录:apache

clipboard.png

而后命令行进入文件对应的路径,输入以下命令:编程

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

而后按照提示,输入相应的信息:小程序

clipboard.png

要注意记住 秘钥库口令,这个后面会用到

最后,就会在当前目录下生成一个证书:浏览器

clipboard.png

配置application.properties

先将咱们生成的证书移到项目目录下:tomcat

clipboard.png

而后配置application.properties文件:安全

# SSL证书相关配置
# https加密端口
server.port=7443
# 证书路径
server.ssl.key-store=classpath:keystore.p12
# 证书秘钥
server.ssl.key-store-password=生成证书时候输入的密钥库口令
# 证书类型
server.ssl.key-store-type=PKCS12
# 证书别名
server.ssl.key-alias=tomcat

细心的读者会发现这里的配置和咱们上面建立证书时使用的命令式对应的。服务器

重定向http到https

由于咱们原来的请求方式都是http, 如今咱们想使用https,就须要作一下重定向,不能跟以前的冲突。app

package com.yunzhiclub.alice;

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.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class AliceApplication {

    public static void main(String[] args) {
         SpringApplication.run(AliceApplication.class, args);
    }

    /**
     * 配置一个 TomcatServletWebServerFactory bean
     * 将http 重定向到 https
     * @return
     */
    @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(8080); // http端口
        connector.setSecure(false);
        connector.setRedirectPort(7443); // application.properties中配置的https端口
        return connector;
    }
}

测试

在浏览其中请求一下后台接口

clipboard.png

正确请求。

总结

本身生成的证书,会被浏览器看作不安全的,因此要上线的项目,仍是去申请一个正规的SSl证书吧。


相关参考:
https://blog.csdn.net/MasonQA...
https://blog.csdn.net/m0_3812...

相关文章
相关标签/搜索