程序员SpringBoot极简教程 · Spring Boot

Spring Boot 结合 SSL

2017-12-29  本文已影响476人  聪明的奇瑞

SSL 安全套接字

SSL 的流程

  1. 客户向服务器发送一个请求 http://twitter.com
  2. 服务器使用 HTTP 代码 302 将请求重定向到 https://twitter.com
  3. 客户端链接到 https://twitter.com,并且在响应中,服务器把数字签名证书提供给客户端
  4. 客户端接收该证书,并将其发送到证书颁发机构进行认证(CA)
  5. 一旦证书通过 CA 认证,客户端与服务器之间就建立起了加密通信

SSL 特点

Spring Boot 启动 HTTPS

获取 SSL 证书,自己生成或证书机构购买,这里通过 keytool 生成,生成后会保存在 HOME 目录下

keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore keystore.p12 -validity 3650
-genkey:生成key
-alias:key的别名
-dname:证书拥有者信息
-storetype:密钥的类型,可选值有 JKS、JCEKS、PKCS12、BKS、UBER
-keyalg:DSA或RSA算法
-keySize:密钥长度
-keystore:证书名称
-validity:证书有效期天数

修改配置文件

#https端口号.
server:
  port: 8090
#证书的路径.
  ssl:
    key-store: classpath:keystore.p12
#证书密码,请修改为您自己证书的密码.
    key-store-password: 123456
#秘钥库类型
    keyStoreType: PKCS12
#证书别名
    keyAlias: tomcat

测试

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(){
        return "hello";
    }
}

将 HTTP 请求重定向到 HTTPS

@Configuration
public class TomcatHttpConfig {
    /**
     * 配置嵌入式的servlet容器工厂为自定义配置tomcat.
     * @return
     */
    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {

            protected void postProcessContext(Context context) {

                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        //添加连接配置,主要是http的配置信息.
        tomcat.addAdditionalTomcatConnectors(initiateHttpConnector());
        return tomcat;
    }

    /**
     * 配置一个http连接信息.
     * @return
     */
    private Connector initiateHttpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8091);
        connector.setSecure(false);
        connector.setRedirectPort(8090);
        return connector;
    }
}

测试:访问 http://localhost:8091/hello 时会重定向到 https://localhost:8090/hello

上一篇 下一篇

猜你喜欢

热点阅读