SpringBoot 中配置 Https

486 阅读2分钟

准备工作

首先我们需要有一个 https 证书,我们可以从各个云服务厂商处申请一个免费的,不过自己做实验没有必要这么麻烦,我们可以直接借助 Java 自带的 JDK 管理工具 keytool 来生成一个免费的 https 证书。进入到 %JAVVA_HOME%bin 目录下,执行如下命令生成一个数字证书:keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore D:javaboy.p12 -validity 365

@Configuration

public class TomcatConfig {

@Bean

TomcatServletWebServerFactory tomcatServletWebServerFactory() {

TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){

@Override

protected void postProcessContext(Context context) {

SecurityConstraint constraint = new SecurityConstraint();

constraint.setUserConstraint("CONFIDENTIAL");

SecurityCollection collection = new SecurityCollection();

collection.addPattern("/*");

constraint.addCollection(collection);

context.addConstraint(constraint);

}

};

factory.addAdditionalTomcatConnectors(createTomcatConnector());

return factory;

}

private Connector createTomcatConnector() {

Connector connector = new

Connector("org.apache.coyote.http11.Http11NioProtocol");

connector.setScheme("http");

connector.setPort(8081);

connector.setSecure(false);

connector.setRedirectPort(8080);

return connector;

}

}
命令含义如下:

  1. genkey 表示要创建一个新的密钥。
  2. alias 表示 keystore 的别名。
  3. keyalg 表示使用的加密算法是 RSA ,一种非对称加密算法。
  4. keysize 表示密钥的长度。
  5. keystore 表示生成的密钥存放位置。
  6. validity 表示密钥的有效时间,单位为天。

具体生成过程如下图:

命令执行完成后 ,我们在 D 盘目录下会看到一个名为 javaboy.p12 的文件。如下图:有了这个文件之后,我们的准备工作就算是 OK 了。

引入 https

接下来我们需要在项目中引入 https。

将上面生成的 javaboy.p12 拷贝到 Spring Boot 项目的 resources 目录下。然后在 application.properties 中添加如下配置:

server.ssl.key-store=classpath:javaboy.p12

server.ssl.key-alias=tomcathttps

server.ssl.key-store-password=111111
其中:
key-store表示密钥文件名。
key-alias表示密钥别名。
key-store-password就是在cmd命令执行过程中输入的密码。

配置完成后,就可以启动 Spring Boot 项目了,此时如果我们直接使用 Http 协议来访问接口,就会看到如下错误:

改用 https 来访问 ,结果如下:

请求转发

考虑到 Spring Boot 不支持同时启动 HTTP 和 HTTPS ,为了解决这个问题,我们这里可以配置一个请求转发,当用户发起 HTTP 调用时,自动转发到 HTTPS 上。

具体配置如下:

@Configuration

public class TomcatConfig {

@Bean

TomcatServletWebServerFactory tomcatServletWebServerFactory() {

TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){

@Override

protected void postProcessContext(Context context) {

SecurityConstraint constraint = new SecurityConstraint();

constraint.setUserConstraint("CONFIDENTIAL");

SecurityCollection collection = new SecurityCollection();

collection.addPattern("/*");

constraint.addCollection(collection);

context.addConstraint(constraint);

}

};

factory.addAdditionalTomcatConnectors(createTomcatConnector());

return factory;

}

private Connector createTomcatConnector() {

Connector connector = new

Connector("org.apache.coyote.http11.Http11NioProtocol");

connector.setScheme("http");

connector.setPort(8081);

connector.setSecure(false);

connector.setRedirectPort(8080);

return connector;

}

}