4

背景

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

这里需要先声明一下,由于我这里还没有一个域名证书,所以使用的是本地自签证书自签证书只能在开发的时候使用,一旦小程序上线,证书将会失效。
大家可以通过各种途径获取到证书,然后配置的过程基本一致,自己配置的时候注意替换就好了。

自签证书

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

首先先找到jdk的bin目录:

clipboard.png

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

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

然后按照提示,输入相应的信息:

clipboard.png

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

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

clipboard.png

配置application.properties

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

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,就需要做一下重定向,不能跟之前的冲突。

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...


喵先生的进阶之路
348 声望21 粉丝