https会使我们的网站更加安全,起码看起来似乎好一些。这里分享Spring Boot配置https的步骤。
1,去阿里云或者腾讯云等等申请SSL证书
个人用户申请免费证书即可。阿里云免费证书申请方法
然后在我们的控制台-SSL证书里面可以添加免费证书:
然后点证书申请:
根据其中指示填写完信息后,会让你给域名添加相应TXT记录,添加后即可申请。大约1-15分钟后证书申请完毕。
然后在列表中点击下载按钮:
下载jks格式:
然后会得到个压缩包,里面有jks证书和密码。
2,Spring Boot配置证书
在Spring Boot配置文件application.properties
中添加以下的配置:
# SSL证书设置 server.ssl.key-store=证书jks文件所在位置 server.ssl.key-store-password=证书密码 server.ssl.keyStoreType=JKS
根据自己的配置修改。
建议一般证书文件放在项目文件夹\src\main\resources
下。例如我的证书文件是ssl.jks
放在项目文件夹\src\main\resources
中,密码是123456
,那么我的配置如下:
# SSL证书设置 server.ssl.key-store=classpath:ssl.jks server.ssl.key-store-password=123456 server.ssl.keyStoreType=JKS
路径需要说明的是,一般classpath:
开头的表示jar包内路径,而在Spring Boot项目中项目文件夹\src\main\resources
文件夹即可对应为classpath
的根目录。
当然也可以放在jar包外其余位置,例如放在项目文件夹中的ssl文件夹中,那么路径就以file:开头配置:
server.ssl.key-store=file:ssl/ssl.jks
这样就要最后保证生成的jar要和上述ssl文件夹放在同一目录,并保证运行目录就是jar所在目录。
这样在开启项目,就是https了!
3,配置http自动跳转https
在启动类中加入如下代码:
/*** http自动跳转https*/publicServletWebServerFactoryservletContainer() { TomcatServletWebServerFactorytomcat=newTomcatServletWebServerFactory() { protectedvoidpostProcessContext(Contextcontext) { SecurityConstraintsecurityConstraint=newSecurityConstraint(); securityConstraint.setUserConstraint("CONFIDENTIAL"); SecurityCollectioncollection=newSecurityCollection(); collection.addPattern("/*"); securityConstraint.addCollection(collection); context.addConstraint(securityConstraint); } }; tomcat.addAdditionalTomcatConnectors(redirectConnector()); returntomcat; } privateConnectorredirectConnector() { Connectorconnector=newConnector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); connector.setPort(8801); // 原http端口connector.setSecure(false); connector.setRedirectPort(8443); // 跳转的https端口,也就是我们配置文件中配置的项目端口returnconnector; }
注意这个Context
类是org.apache.catalina
包下的,Connector
类是org.apache.catalina.connector
包下的。
根据自己的需要修改上述第二个方法中http端口和https端口。
实际情况下,为了更方便地开启/关闭https,我们可以使用控制配置文件值实现动态注入Bean,以控制打开或者关闭https的功能。
上述代码,servletContainer
方法返回值会被注册为Bean,只有这个方法返回值注册为Bean了,才会开启https。因此我们使用@ConditionalOnProperty
实现配置文件控制并动态注入。
我们自定义一个配置名,这里就叫做swsk33.server.enablehttps
,只有配置文件存在这一项配置且其值为true
时,才会注入这个Bean,才会开启https,否则默认使用http。代码如下:
name= {"swsk33.server.enablehttps"}, havingValue="true") (publicServletWebServerFactoryservletContainer() { TomcatServletWebServerFactorytomcat=newTomcatServletWebServerFactory() { protectedvoidpostProcessContext(Contextcontext) { SecurityConstraintsecurityConstraint=newSecurityConstraint(); securityConstraint.setUserConstraint("CONFIDENTIAL"); SecurityCollectioncollection=newSecurityCollection(); collection.addPattern("/*"); securityConstraint.addCollection(collection); context.addConstraint(securityConstraint); } }; tomcat.addAdditionalTomcatConnectors(redirectConnector()); returntomcat; }
重点是上面加了@ConditionalOnProperty
注解,这个注解可以根据配置文件值,实现条件注入。其中name
表示配置名,是个数组,havingValue
表示指定配置必须要有这个值。也就是说必须当这个/多个指定配置名存在且为这个值时,才会注入这个Bean。
最后在配置文件application.properties
加入我们指定的配置:
swsk33.server.enablehttps=true
这样就开启了https,填false
关闭https。
注意关闭https的话还需要把上面讲到的以下关于证书配置项也给去掉:
server.ssl.key-store server.ssl.key-store-password server.ssl.keyStoreType