【开发心得】Springboot开启https,同时支持https与http

名词解析:

超文本传输安全协议(HyperText Transfer Protocol Secure),缩写:HTTPS;常称为 HTTP over TLS、HTTP over SSL 或 HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在 1994 年首次提出,随后扩展到互联网上。

默认端口:443

一、springboot开启https

1.获取证书

shell(cmd,powershell..)输入如下命令,并且按照示例进行操作,前提,正确配置java环境变量。

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

示例: 

输入密钥库口令:${自己写}
再次输入新口令:${自己写}
您的名字与姓氏是什么?
  [Unknown]:  ${自己写}
您的组织单位名称是什么?
  [Unknown]:  ${自己写}
您的组织名称是什么?
  [Unknown]:  ${自己写}
您所在的城市或区域名称是什么?
  [Unknown]:  ${自己写}
您所在的省/市/自治区名称是什么?
  [Unknown]:  ${自己写}
该单位的双字母国家/地区代码是什么?
  [Unknown]:  CN
CN=kaibowang, OU=yuxuelian, O=yuxuelian, L=chengdu, ST=chengdushi, C=china是否正确?
  [否]:  y

输入 <tomcat> 的密钥口令
        (如果和密钥库口令相同, 按回车):
再次输入新口令:

Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore C:\Users\Administrator\.keystore -destkeystore C:\Users\Administrator\.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

2.设置ssl信息

在Springboot资源路径,如resources中的application.yml中如下配置:

server:
  # https协议端口
  port: 443
  ssl:
    protocol: TLS
    key-store: classpath:server.keystore
    key-alias: tomcat
    enabled: true
    key-store-password: 123456
    key-store-type: JKS

 3.重新mvn clean,install 重启项目验证。

二、同时开启http与https

Springboot1.x与2.x设置方式存在区别。
EmbeddedServletContainerFactory 这个类在Springboot2.x版本中,已经替换为 TomcatServletWebServerFactory 

1.Springboot1.x

@Configuration
public class TomcatConfig {

@Value("${server.http.port}")
private int httpPort;

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
    return new EmbeddedServletContainerCustomizer() {
        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            if (container instanceof TomcatEmbeddedServletContainerFactory) {
                TomcatEmbeddedServletContainerFactory containerFactory =
                        (TomcatEmbeddedServletContainerFactory) container;

                Connector connector = new Connector(TomcatEmbeddedServletContainerFactory.DEFAULT_PROTOCOL);
                connector.setPort(httpPort);
                containerFactory.addAdditionalTomcatConnectors(connector);
            }
        }
    };
}
}

2.Springboot2.x

    @Value("${server.http.port}")
    private int httpPort;
    
    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addAdditionalTomcatConnectors(createStandardConnector());
        return tomcat;
    }

    private Connector createStandardConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setPort(httpPort);
        return connector;
    }

 其中,如果需要将http请求转发到https,住家如下设置:

        connector.setScheme("http");
        connector.setSecure(true);     //设置false重定向容易出错,推荐设置为true
        connector.setRedirectPort(443);//@value获取更佳

done
 

猜你喜欢

转载自blog.csdn.net/qq_26834611/article/details/115194283