共计 2632 个字符,预计需要花费 7 分钟才能阅读完成。
背景
现在在做的项目,一部分功能时建立在小程序上的,所以就不得不面临一个问题,就是小程序在发起请求,请求后台的时候,只能使用 https,会对服务器的域名进行 https 证书校验,所以,我们就不得不去考虑配置证书的问题。
这里需要先声明一下,由于我这里还没有一个域名证书,所以使用的是本地自签证书。自签证书只能在开发的时候使用,一旦小程序上线,证书将会失效。大家可以通过各种途径获取到证书,然后配置的过程基本一致,自己配置的时候注意替换就好了。
自签证书
为了开发试验,我们需要本地生成一个自签证书。我们直接使用 JDK 自带的 keytool 工具来生成证书。
首先先找到 jdk 的 bin 目录:
然后命令行进入文件对应的路径,输入如下命令:
keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
然后按照提示,输入相应的信息:
要注意记住秘钥库口令,这个后面会用到
最后,就会在当前目录下生成一个证书:
配置 application.properties
先将我们生成的证书移到项目目录下:
然后配置 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;
}
}
测试
在浏览其中请求一下后台接口
正确请求。
总结
自己生成的证书,会被浏览器看做不安全的,所以要上线的项目,还是去申请一个正规的 SSl 证书吧。
相关参考:https://blog.csdn.net/MasonQA…https://blog.csdn.net/m0_3812…