springboot实现https访问

42次阅读

共计 2123 个字符,预计需要花费 6 分钟才能阅读完成。

略过 springboot 项目的创建步骤

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

C:\Users\Administrator>keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore keystore.p12 -validity 3650

根据提示输入


完成后在 C:UsersAdministrator 目录下就会有一个 keystore.p12 文件

配置 application.properties

server.port=443
# 证书路径
server.ssl.key-store=classpath:keystore.p12
# 证书秘钥
server.ssl.key-store-password=javajava
# 证书类型
server.ssl.key-store-type=PKCS12
# 证书别名
server.ssl.key-alias=tomcat

keystore.p12 是放在 resources 目录下

当在 application.properties 中的证书路径是这样时

server.ssl.key-store=keystore.p12

keystore.p12 是放在项目根目录下,注意多模块项目,这是非多模块项目的目录结构,这时 keystore.p12 就是放在了项目根目录

但是打成功 jar 包运行的时候报错

将 jar 包解压出来发现里面根本没有 keystore.p12 文件,说明没有被打包进来,解决办法是将 keystore.p12 文件放在 resources 目录下,在 application.properties 中路径前加上 classpath

server.ssl.key-store=classpath:keystore.p12

或者也可以将 keystore.p12 放在 jar 包的同级目录下

可见 springboot 里的 classpath 指的就是 classes 目录,rosources 目录就是直接映射到 classes 目录

自动重定向 http 到 https

在启动类添加如下代码


    @Bean
    public TomcatServletWebServerFactory servletContainer() {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(initiateHttpConnector());
        return tomcat;
    }

    /**
     * 让我们的应用支持 HTTP 是个好想法,但是需要重定向到 HTTPS,* 但是不能同时在 application.properties 中同时配置两个 connector,* 所以要以编程的方式配置 HTTP connector,然后重定向到 HTTPS connector
     * @return Connector
     */
    private Connector initiateHttpConnector() {Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(80); // http 端口
        connector.setSecure(false);
        connector.setRedirectPort(443); // application.properties 中配置的 https 端口
        return connector;
    }

controller 测试的代码如下

@RestController
public class TestController {@GetMapping(value = "/")
    public String hello() {return "你好";}
}

浏览器验证

在浏览器地址栏输入 localhost,回车即可看到


在地址栏输入 localhost 相当于 http://localhost:80,回车切换成 https://localhost:443,因为 80 和 443 端口分别是 http 和 https 的默认端口,所以都隐藏了,如何同时支持 http 和 https 而端口不会变的,目前还在探索中。。

码云代码

正文完
 0