赞
踩
关键字:微信小程序、SpringBoot 项目、腾讯云服务器、SSL、HTTPS、Tomcat
注:本文记录了一个菜鸟解决问题的思路,觉得啰嗦可以略过,解决方案在文末。技术不精,文章有错误烦请指正。
最近想着做个小程序,后端使用 SpringBoot,直接跑在腾讯云服务器上。微信小程序要求配置指定的通信域名,意思是只能访问特定的服务器和接口。最关键的是这个域名需要使用 HTTPS 协议。配置 SSL 证书也不难,腾讯云上提供了免费的证书提供商,也提供了几种配置 SSL 证书的方法,比如使用 NGINX、Tomcat、Apache 等。
问题出在如果想要使用 HTTPS 协议访问启动的 SpringBoot 项目就有点困难,因为如果使用 NGINX 和 Apache 配置 SSL 证书的话,HTTP 跑在 80 端口,HTTPS 跑在 443 端口,而 SpringBoot 项目跑在默认的 8080 端口。这样配置的结果是,可以使用 HTTPS 协议访问域名,但是只能访问默认的 443 端口,无法访问 8080 端口。使用 HTTP 协议可以访问到 8080 端口。
最初没有想明白各个端口的作用,单纯地觉得,只要 443 端口开放,并且配置了 SSL 证书,就可以通过 HTTPS 协议访问该域名下的所有资源。于是问题自然拆解成了两个:开放 443 端口,配置 SSL 证书。
配置 SSL 证书腾讯云上有教过,我三种都尝试了下,而且不止一遍。
开放 443 端口也是在腾讯云上操作,点击配置就可以。
二者操作完成后,出现了上述的结果。于是从 NGINX 换到 Apache。再试,都不成功。后面开始怀疑是不是服务器的 443 端口有问题,联系了客服,但是没理我。
出问题了肯定要搜索。记录下每次搜索的关键字即可。
SSL 证书如何配置?
443 端口打不开怎么办?
HTTP 能访问到的资源 HTTPS 访问不到怎么办?
配置了 SSL 但是无法使用 HTTPS 访问怎么办?
…
这些关键词搜索出来的文章真的是一言难尽,十几篇文章同一个回答就不说了,老问题了;题目是 HTTP 能访问到的资源 HTTPS 访问不到怎么办,回答是把 S 去掉。让人很难相信是技术人员写的文章。
搜索了好几天基本都是无用功,每天都在原点徘徊。
突然意识到,HTTPS 协议可以使用, 443 端口开放,而且 SpringBoot 内置了 Tomcat,可以用 Tomcat 配置 SSL 证书,项目运行在 443 端口,之后再使用 HTTPS 协议就可以直接访问到项目。
搜索到 Spring Boot 使用SSL-HTTPS - 知乎 (zhihu.com),解决了本次问题。
application.yml
server:
# 监听端口
port: 443
ssl:
# 腾讯云证书文件夹下 Tomcat 文件夹下
key-store: classpath:lvshui5u.com.jks
# Java 密钥库格式
key-store-type: JKS
# 密码,一般在请求证书时有配置过
key-store-password: xxxxxx
配置到这里就可以实现 HTTPS 协议访问到 lvshui5u.com:443(端口默认可省略) 下的资源和接口,可以使用下述代码配置 HTTP 协议访问 lvshui5u.com:8080。
TomcatHttpConfig.java
package com.lvshui5u.hellolvshui5u.config; 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.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author: lvshui5u * @date: 2021/10/11 23:14 * @describe: */ @Configuration public class TomcatHttpConfig { @Bean public TomcatServletWebServerFactory servletWebServerFactory(){ TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() { @Override protected void postProcessContext(Context context) { SecurityConstraint securityConstraint = new SecurityConstraint(); securityConstraint.setUserConstraint("CONFIDENTIAL"); SecurityCollection securityCollection = new SecurityCollection(); securityCollection.addPattern("/*"); securityConstraint.addCollection(securityCollection); context.addConstraint(securityConstraint); } }; // 额外添加一个连接 tomcat.addAdditionalTomcatConnectors(initiateHttpConnector()); return tomcat; } private Connector initiateHttpConnector(){ Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); // 协议 connector.setScheme("http"); // 端口 connector.setPort(8080); connector.setSecure(false); // 端口转发 connector.setRedirectPort(443); return connector; } }
配置到此,项目中资源有两种访问方式
https://www.lvshui5u.com:443/xxx (443 端口可省略)
http://www.lvshui5u.com:8080/xxx
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。