028-86261949

当前位置:首页 > 技术交流 > 如何把本地(内网)项目以https协议的方式映射到外网

如何把本地(内网)项目以https协议的方式映射到外网

2020/12/16 09:39 分类: 技术交流 浏览:0

我们在写项目时一般都是用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 的方式映到外网去。

  环境

  1. springBoot项目
  2. 域名 (我在阿里云购买的)
  3. SSL证明(阿里云免费申请)
  4. Ngrok 内网穿透(免费把本地的项目映射到外网)http://www.ngrok.cc/

 

三,流程图

 

 

1. 浏览器输入域名会访问的你申请的域名

2. 访问到底域名会解析到你申请的内网穿透的域名

3. 内网穿透访问到你本地的项目

4. 你本地项目重定向到443端口

5. 浏览器从原来的http变成https

 

四项目实现​​

1.首先去阿里云弄一个免费的SSL证书

​这里选择服务器类型tomcat 因为springboot内嵌了tomcat 用这种方式配置比较简单

下载后的ssl证书 放到项目里面的resource路径下

 

 

2 Springboot里直接修改 application配置文件

  这里一定要注意   是  key-store 和 key-store-password  我在配置时写成了 key-password 弄了很久没找到原因

 

  

现在实现的效果是

 可以用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

 

去域名管理中心解析你的域名

 

 

本地启动ngrok 的服务

效果  

  输入你的域名 不写https 也会自动跳转到https   这里是因为我刚刚在启动类里面配置了 重定向

   

  

 

#标签:JAVA,内网,外网