申请阿里云免费的HTTPS证书和SpringBoot配置HTTPS与HTTP重定向成HTTPS

由于HTTPS对于个人开发者而言,一个HTTPS证书的价格还是有点贵,国内有一些云服务器厂商提供免费的HTTPS证书,一个账号可以申请数个。

申请流程
我们去阿里云控制台,搜索SSL
EdulGT.md.png
我们点击购买证书
EdnvKH.md.png

选择免费的证数购买
Edu9at.md.png

购买后我们申请,填写资料,很快就好了
EduCIP.md.png
我们这里springboot用的是tomcat,所以我们下载tomcat的
EdnR8U.md.png

于是我们下载下来,有个xxxx.pfx文件和一个密码文件,我们把xxxx.pfx改名后放到resource目录下,然后我们在配置文件中这样配置
yml配置文件

 
  1. #服务器配置
  2. server:
  3. port: 443
  4. ssl:
  5. key-store: classpath:aliyu.pfx
  6. key-store-password: xxxxxx
  7. key-store-type: PKCS12

这样就行了。

不过在jdk中提供了一个Java数字证书管理工具keytool,在\jdk\bin目录下,通过这个工具可以自己生成一个数字证书,生成命令如下:

 
  1. Keytool -genkey -alias tomcat https -keyalg RSA -keysize 2048 -keystore sang -validity 365
  • genkey表示要创建一个新的密钥。
  • -alias表示keystore的别名。
  • -keyalg表示使用的加密算法是RSA,一种非对称加密算法.
  • -keysize表示密钥的长度.
  • -keystore表示生成的密钥存放位直。
  • -validity表示密钥的有效时间,单位为天。

配置HTTPS
在cmd窗口中直接执行如上命令,在执行的过程中需要输入密钥口令等信息,根据提示输入即可。命令执行完成后,会在当前用户目录下生成一个名为sang.pl2的文件,将这个文件复制到项目的根目录下,然后在application.properties中做如下配置:

 
  1. server.ssl.key-store=sang
  2. server.ssl.key-alias=tomcathttps
  3. server.ssl.key-store-password=l23456
  • key-store表示密钥文件名。
  • key-alias表示密钥别名。
  • key-store-password就是在cmd命令执行过程中输入的密码。

配置成功后,启动项目就可以了 但是HTTP就不能访问了,因为SpringBoot不支持同时在配置中启动HTTP和TTPS。这个时候可以配置请求重定向,将请求重定向为HTTPS请求。

HTTP重定向为HTTPS请求

 
  1. @Configuration
  2. public class TomcatConfig {
  3. @Bean
  4. TomcatServletWebServerFactory tomcatServletWebServerFactory() {
  5. TomcatServletWebServerFactory factory= new TomcatServletWebServerFactory () {
  6. @Override
  7. protected void postProcessContext(Context context){
  8. SecurityConstraint constraint=new SecurityConstraint();
  9. constraint.setUserConstraint("CONFIDENTIAL");
  10. SecurityCollection collection=new SecurityCollection();
  11. collection.addPattern("/*");
  12. constraint.addCollection(collection);
  13. context.addConstraint(constraint);
  14. }
  15. };
  16. factory.addAdditionalTomcatConnectors(createTomcatConnector());
  17. return factory;
  18. }
  19. private Connector createTomcatConnector(){
  20. Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
  21. connector.setScheme("http");
  22. connector.setPort(80);
  23. connector.setSecure(false);
  24. connector.setRedirectPort(443);
  25. return connector;
  26. }
  27. }

首先配置一个TomcatServletWebServerFactory,然后添加一个Tomcat中的Connector(监昕80端口),并将请求转发到443上去。