参考:在Spring Boot上启用HTTPS
Spring Boot配置SSL证书(开启https)
springboot配置https以及http重定向
SpringBoot开发案例之集成SSL证书

使用阿里云的证书

1:下载证书

将证书文件和密码文件拷贝到与配置文件application.properties或application.yml相同的目录下

2:配置application.yml文件

  1. server:
  2. port: 443 #HTTPS协议默认端口号为443,需要使用其他端口时,您可以在此处自定义。
  3. ssl:
  4. key-alias: tomcat
  5. key-store-password: ******** #填写pfx-password.txt文件内的密码。
  6. key-store-type: PKCS12
  7. key-store: classpath:<domain_name.pfx> #您需要使用实际的证书名称替换domain_name.pfx。

后面的配置和自己生成证书是一样的。

自己生成证书

1、利用keytool生成一个证书

-genkey 表示要创建一个新的密匙。
-alias 表示keystore的别名。
-keyalg 表示使用的加密算法是RSA,一种非对称加密算法。
-keystore 表示生成的密匙存放位置。
-validity 表示密匙的有效时间,单位为天。

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

在那个文件夹下运行这个keytool命令的,证书文件默认在当前目录下。

2、把证书文件拷贝到与配置文件application.properties或application.yml相同的目录下

image.png

3、application.yml增加ssl配置

classpath:是打包的jar文件里的相对路径,
file:是项目文件相对路径,jar文件放在什么文件夹下,那个就是项目文件路径
classpath是file的里面的。

  1. #服务器端口配置
  2. server:
  3. port: 8888 #正常访问https的端口
  4. port-http: 8080 #这个是http端口,这个端口会做一个重定向的调整
  5. ssl:
  6. enabled: true #SSL证书是否启用(默认是true)
  7. key-store-password: 123456 #填写pfx-password.txt文件内的密码。
  8. key-store-type: PKCS12
  9. key-store: classpath:keystore.p12 #您需要使用实际的证书名称替换domain_name.pfx。

4、配置http和https的重定向

如果server-ssl-enabled=true,或者默认true的话,下面这个重定向开启后,如果没有配置正确的证书文件,就会报错。本地测试的时候,可以把server-ssl-enabled设置为false

  1. package com.tj.config;
  2. import org.apache.catalina.Context;
  3. import org.apache.catalina.connector.Connector;
  4. import org.apache.coyote.http11.Http11NioProtocol;
  5. import org.apache.tomcat.util.descriptor.web.SecurityCollection;
  6. import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
  7. import org.springframework.beans.factory.annotation.Value;
  8. import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.context.annotation.Configuration;
  11. @Configuration
  12. public class TomcatConfig {
  13. // http 请求端口,线上配置为 8080
  14. @Value("${server.port-http}")
  15. private int serverPortHttp;
  16. // 服务器运行端口,等同于 HTTPS 请求端口,线上 443
  17. @Value("${server.port}")
  18. private int serverPortHttps;
  19. @Bean
  20. TomcatServletWebServerFactory tomcatServletWebServerFactory() {
  21. TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {
  22. @Override
  23. protected void postProcessContext(Context context) {
  24. // TODO Auto-generated method stub
  25. SecurityConstraint constraint = new SecurityConstraint();
  26. constraint.setUserConstraint("CONFIDENTIAL");
  27. SecurityCollection collection = new SecurityCollection();
  28. collection.addPattern("/");
  29. constraint.addCollection(collection);
  30. context.addConstraint(constraint);
  31. }
  32. };
  33. factory.addAdditionalTomcatConnectors(createTomcatConnector());
  34. return factory;
  35. }
  36. private Connector createTomcatConnector() {
  37. Connector connector = new Connector(Http11NioProtocol.class.getName());
  38. //Connector监听的http的端口号
  39. connector.setPort(serverPortHttp);
  40. connector.setSecure(false);
  41. //监听到http的端口号后转向到的https的端口号
  42. connector.setRedirectPort(serverPortHttps);
  43. return connector;
  44. }
  45. }

5、配置好就可以启动项目,然后访问了

访问http
http://127.0.0.1:8080
会重定向到https
https://127.0.0.1:8888
如果不使用https,就报错如下
image.png
因为是自己生成的,是不被浏览器认可的,可以作为测试使用。
image.png