zoukankan      html  css  js  c++  java
  • SpringBoot配置HTTPS,并实现HTTP访问自动转HTTPS访问

    【转】https://www.jianshu.com/p/8d4aba3b972d

    推荐使用nginx配置https,因本文产生的任何问题不再做回复.

    这里说一下为什么写这篇文章,因为我也是一个SpringBoot初学者,在配置https的时候遇到了一些坑,根据网上的配置方式,发现一些类已经过时,这里仅以记录一下我的配置过程,以供参考.

    1.使用jdk自带的 keytools 创建证书

    打开cmd窗口,输入如下命令

    keytool -genkey -alias tomcat -keyalg RSA -keystore ./server.keystore 
    

    按照提示进行操作

    输入密钥库口令:123456
    再次输入新口令:123456
    您的名字与姓氏是什么?
      [Unknown]:  kaibowang
    您的组织单位名称是什么?
      [Unknown]:  yuxuelian
    您的组织名称是什么?
      [Unknown]:  yuxuelian
    您所在的城市或区域名称是什么?
      [Unknown]:  chengdu
    您所在的省/市/自治区名称是什么?
      [Unknown]:  chengdushi
    该单位的双字母国家/地区代码是什么?
      [Unknown]:  china
    CN=kaibowang, OU=yuxuelian, O=yuxuelian, L=chengdu, ST=chengdushi, C=china是否正确?
      [否]:  y
    
    输入 <tomcat> 的密钥口令
            (如果和密钥库口令相同, 按回车):
    再次输入新口令:
    
    Warning:
    JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore C:UsersAdministrator.keystore -destkeystore C:UsersAdministrator.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
    

    创建完成后,可在用户根目录查看生成的keystore文件

    2.新建springboot项目,将上一步生成的keystone文件复制到项目的根目录,在application.properties添加如下配置

    server.port=443
    server.ssl.key-store=server.keystore
    server.ssl.key-alias=tomcat
    server.ssl.enabled=true
    server.ssl.key-store-password=123456
    server.ssl.key-store-type=JKS
    
    说明一下

    这里将服务器端口号设置成443端口,即https的默认访问端口,那么在进行https访问的时候可以不带端口号直接访问,如果端口被占用使用

    netstat -ano
    

    查看哪个进程号占用了端口,使用

    tasklist|findstr (查看到的进程号)
    # simple
    C:UsersAdministrator>tasklist|findstr 3664
    vmware-hostd.exe              3664 Services                   0      5,040 K
    

    打开任务管理器,杀死占用进程,或打开对应的应用程序的设置,关闭监听
    至此 https配置完毕 访问 https://localhost 查看是否配置成功

    3.http访问自动转https访问

    向spring容器中注入两个Bean,代码如下

        @Bean
        public Connector connector(){
            Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
            connector.setScheme("http");
            connector.setPort(80);
            connector.setSecure(false);
            connector.setRedirectPort(443);
            return connector;
        }
    
        @Bean
        public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector){
            TomcatServletWebServerFactory tomcat=new TomcatServletWebServerFactory(){
                @Override
                protected void postProcessContext(Context context) {
                    SecurityConstraint securityConstraint=new SecurityConstraint();
                    securityConstraint.setUserConstraint("CONFIDENTIAL");
                    SecurityCollection collection=new SecurityCollection();
                    collection.addPattern("/*");
                    securityConstraint.addCollection(collection);
                    context.addConstraint(securityConstraint);
                }
            };
            tomcat.addAdditionalTomcatConnectors(connector);
            return tomcat;
        }
    

    首先 这里需要使用 TomcatServletWebServerFactory 这个类,网上清一色的都是使用 EmbeddedServletContainerFactory 这个类.
    在新版本的SpringBoot中,我发现已近找不到这个类了,几经周转,翻阅源码,才找到这个类,这也是我为什么写这篇文章的初衷.
    其次在这里设置http的监听端口为80端口,http默认端口,这样在访问的时候也可以不用带上端口号.
    完成以上配置后,我们访问 http://localhost 即可自动跳转为 https://localhost

  • 相关阅读:
    C#磁吸屏幕窗体类库
    准备
    我写的诗
    How to turn off a laptop keyboard
    How to tell which commit a tag points to in Git?
    Why should I care about lightweight vs. annotated tags?
    How to get rid of “would clobber existing tag”
    Facebook, Google and Twitter threaten to leave Hong Kong over privacy law changes
    The need for legislative reform on secrecy orders
    Can a foreign key be NULL and/or duplicate?
  • 原文地址:https://www.cnblogs.com/exmyth/p/11344779.html
Copyright © 2011-2022 走看看