SpringBoot精通系列-Spring Boot中如何配置Https

导语
   Https作为一个比较安全的协议,现在已经越来越普及了,特别是在完成小程序或者是公众号开发的时候,https基本上都是刚需了。但是一个HTTPS的证书是比较费钱的事情,个人开发者可以通过云服务商获取免费的一个证书,有效期是一年,可以申请20个。那么在现在SpringBoot火热的时候,在SpringBoot中是如何开启https的配置呢?

HTTPS简介

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

  历史上,HTTPS连接经常用于网络上的交易支付和企业信息系统中敏感信息的传输。在2000年到2010年之间HTTPS被广泛开始使用,确保各类型的网页真实,保护账户和保持用户通信,身份和网络浏览的私密性。
  另外的还有一种安全超文本传输协议 S-HTTP,也是HTTP协议的安全传输实现,但是HTTPS的应用广泛,导致了S-HTTP没有得到广泛支持。

开始准备

  首先需要做的事情就是有一个HTTPS的证书,可以从云服务商获取,例如阿里云、腾讯云等,但是在自己做实验的时候,其实并不需要那么麻烦,Java JDK管理工具keytool工具就可以自己创建一个https的证书。
  首先要做的事情就是进入到JAVA_HOME的bin路径下执行如下的命令


keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore /user/local/key.p12 -validity 365

  这条命令含义如下

  • genkey : 表示要创建一个新的密钥
  • alias : 表示keystore 的别名
  • keyalg : 表示使用的加密算法是RSA,一种非对称加密算法
  • keysize : 表示密钥的长度
  • keystore : 表示生成的密钥存放的位置
  • validity : 表示密钥有效时间,单位为天

  执行完成之后就会在指定的路径下面看到一个对应的生成文件,得到这个文件之后整个的生成工作就算做完了。

引入https

  接下来的工作就是将生成的密钥拷贝到对应的resource目录下面,然后在对应的application.properties文件中加入如下的配置

server.ssl.key-store=classpath:key.p12
server.ssl.key-alias=tomcathttps
server.ssl.key-store-password=111111


  配置完成之后,就可以启动Spring Boot的项目了,整个时候如果使用HTTP来访问接口,那么就会看到Bad Request 的提示,这个时候在使用https来访问接口就会看到不安全提示,这个时候就可以点击继续访问进行访问了。因为这里是自己生成的https的证书,它是不被浏览器所认可的,所以就会有这个提示。

请求转发

  在一个Spring Boot的项目中,不能同时支持HTTP和HTTPS两种请求,为了解决这个问题,就需要配置一个请求转发的操作,当用户发起HTTP调用的时候,自动转发到HTTPS上。如下

@Configuration
public class TomcatConfig{
	
	@Bean
	TomcatServletWebServerFactory tomcatServletWebServerFactory(){
		TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){
			@Override
			protected void postProcessContext(Context context){
				SecurityConstraint constraint = new SecurityConstraint();
				constraint.setUserConstraint("CONFIDENTIAL");
				SecurityCollection collection = new SecurityCollection();
				collection.addPattern("/*");
				constraint.addCollection(collection);
				context.addConstraint(constraint);
			
			}
			
		};
		factory.addAdditionalTomcatConnectors(createTomcatConnector());
		return factory;
	}

	
	private Connector createTomcatConnector(){
		Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
		connector.setScheme("http");
		connector.setPort(8081);
		connector.setSecure(false);
		connector.setRedirectPosrt(8080);
		return connector;
	}
	
	

}

  通过上面的操作,配置了HTTP的请求端口为8081,所有来自8081的请求,就会被自动重新定向到8080 这个https 的端口上。这样当在去访问HTTP请求的时候,就会自动重定向到https。

总结

  Spring Boot 中加入HTTPS其实还是比较方便的,如果使用Nginx 或者是Tomcat的时候,HTTPS也可以非常方便的进行配置,当从各个云服务厂商申请到https证书之后,都会对其有具体并且详细的教程,一般的情况下按照官方的教程是没有错的,但是也不免出现官方文档Bug。

你可能感兴趣的:(SpringBoot核心应用,java,https,http)