我们在写项目时一般都是用ip就可以直接测试了。但有的业务场景需要我们用到域名。这时候我们去申请一个域名就行了,但此时我们申请的域名协议是http的不是https的。对接微信时很多情况是用的https 。且在对接微信是我们需要边对接边调试。如果直接把项目打包到服务器,调试时会很麻烦,所以这篇文章我们要讲的是“如果把本地(内网)项目以https协议的方式映射到外网”
一:首先我们先在百度百科了解一下什么是https
HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 [1] 。HTTPS 在HTTP 的基础下加入SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP 之间)。这个系统提供了身份验证与加密通讯方法。它被广泛用于万维网上安全敏感的通讯,例如交易支付等方面
从上面我们可以得知 https比http安全一般用于支付,https的安全基础是SSL。所以我们要配置https协议的时候需要用得到SSL证书。
二 需要准备的环境
我们要做的事情是把本地的Springboot项目通过https 的方式映到外网去。
环境
- springBoot项目
- 域名 (我在阿里云购买的)
- SSL证明(阿里云免费申请)
- Ngrok 内网穿透(免费把本地的项目映射到外网)http://www.ngrok.cc/
三,流程图
image1. 浏览器输入域名会访问的你申请的域名
2. 访问到底域名会解析到你申请的内网穿透的域名
3. 内网穿透访问到你本地的项目
4. 你本地项目重定向到443端口
5. 浏览器从原来的http变成https
四项目实现
1.首先去阿里云弄一个免费的SSL证书
image这里选择服务器类型tomcat 因为springboot内嵌了tomcat 用这种方式配置比较简单
下载后的ssl证书 放到项目里面的resource路径下
2 Springboot里直接修改 application配置文件
这里一定要注意 是 key-store 和 key-store-password 我在配置时写成了 key-password 弄了很久没找到原因
image现在实现的效果是
可以用https我们的项目 但是我如果直接输入域名用http访问就访问不到。
因为http是默认80端口 而https 是默认的 443 端口。
所以我在我的启动类里面写一段代码 。访问http 是自动跳转到https
EmbeddedServletContainerFactory 可以因为你的spring boot 版本 过高没有这个class 那么你需要去你对应spring boot版本的class
public class HuahaiApplication {
public static void main(String[] args)
{
SpringApplication.run(HuahaiApplication.class, args);
}
/**
-
配置一个 TomcatServletWebServerFactory bean
-
将http 重定向到 https
-
@return
*/
/**
- it's for set http url auto change to https
*/
@Bean
public EmbeddedServletContainerFactory servletContainer(){
TomcatEmbeddedServletContainerFactory tomcat=new TomcatEmbeddedServletContainerFactory(){
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint=new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");//confidential
SecurityCollection collection=new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(httpConnector());
return tomcat;
}
//配置http转https
@Bean
public Connector httpConnector(){
Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(80);
connector.setSecure(false);
connector.setRedirectPort(443);
return connector;
}
}
3 我可以把我本地的服务映射到外网去访问借助一个 sunny-ngrok
image
去域名管理中心解析你的域名
image
本地启动ngrok 的服务
image
效果
输入你的域名 不写https 也会自动跳转到https 这里是因为我刚刚在启动类里面配置了 重定向
image
image
网友评论