黑马程序员技术交流社区

标题: 【重庆校区】基于spring boot同时支持http、https [打印本页]

作者: 2017heima    时间: 2017-11-25 15:13
标题: 【重庆校区】基于spring boot同时支持http、https
本帖最后由 2017heima 于 2017-12-3 22:14 编辑

springboot配置ssl证书启用htts协议
一.基础概念:
ssl:SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全
及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。Secure Socket Layer,为Netscape所研发,用以保障在
Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。
http:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都
必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
https:HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是
HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL
二.ssl证书安装:
获取ssl的证书有两种方式,一种可以采用第三方的CA机构提供的ssl证书,另外一种可以在服务器上使用keytool工具生成ssl证
书。
第三方CA机构:市面上有很多家类似的CA的机构,目前主流的有Symantec ,GeoTrust等之类的。
自己生成ssl证书:
命令:keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity
3650
执行命令或出现如下显示,然后逐项按提示填入下面的内容
Enter keystore password:
Re-enter new password:
What is your first and last name?
[Unknown]:
What is the name of your organizational unit?
[Unknown]:
What is the name of your organization?
[Unknown]:
What is the name of your City or Locality?
[Unknown]:
What is the name of your State or Province?
[Unknown]:
What is the two-letter country code for this unit?
[Unknown]:
Is CN=, OU=, O=, L=, ST=, C=?
[no]: yes
执行完之后会生成一个PKCS12格式的叫做keystore.p12的证书,之后启动Spring Boot时会引用这个证书
PS:设置密码的时候也可以使用默认的密码 changei,之后启动的时候设置密码就可以用这个密码来使用生成的ssl证书
三.springboot配置https
默认情况下Spring Boot内嵌的Tomcat服务器会在8080端口启动HTTP服务,Spring Boot允许在application.properties中配置
HTTP或HTTPS,但是不可同时配置,如果两个都启动,至少有一个要以编程的方式配置,下面就用编程的方式配置HTTPS,tomcat服务
器会在443端口启动HTTPS服务。
把上面生成的keystore.p12证书文件拷贝到springboot项目source目录下
在springboot项目中创建配置applicationSSL.properties文件
在文件中添加如下配置内容
custom.tomcat.https.port=443
custom.tomcat.https.secure=true
custom.tomcat.https.scheme=https
custom.tomcat.https.ssl=true
custom.tomcat.https.keystore=keystore.p12
custom.tomcat.https.keystore-password=changeit
创建java配置类WebSSLConfig.java
@Configuration
@PropertySource("applicationSSL.properties")
@EnableConfigurationProperties(WebSSLConfig.TomcatSslConnector.class)
public class WebSSLConfig extends WebMvcConfigurerAdapter {
@ConfigurationProperties(prefix = "custom.tomcat.https")
public static class TomcatSslConnector {
/**
* 端口号
*/
private Integer port;
/**
* 是否开启ssl
*/
private Boolean ssl = true;
/**
* 是否安全
*/
private Boolean secure = true;
/**
* 协议规则
*/
private String scheme = "https";
/**
* 证书文件
*/
private File keystore;
/**
* 证书密码
*/
private String keystorePassword;
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
public Boolean getSsl() {
return ssl;
}
public void setSsl(Boolean ssl) {
this.ssl = ssl;
}
public Boolean getSecure() {
return secure;
}
public void setSecure(Boolean secure) {
this.secure = secure;
}
public String getScheme() {
return scheme;
}
public void setScheme(String scheme) {
this.scheme = scheme;
}
public File getKeystore() {
return keystore;
}
public void setKeystore(File keystore) {
this.keystore = keystore;
}
public String getKeystorePassword() {
return keystorePassword;
}
public void setKeystorePassword(String keystorePassword) {
this.keystorePassword = keystorePassword;
}
public void configureConnector(Connector connector) {
if (port != null) {
connector.setPort(port);
}
if (secure != null) {
connector.setSecure(secure);
}
if (scheme != null) {
connector.setScheme(scheme);
}
if (ssl != null) {
connector.setProperty("SSLEnabled", ssl.toString());
}
if (keystore != null && keystore.exists()) {
connector.setProperty("keystoreFile", keystore.getAbsolutePath());
connector.setProperty("keystorePassword", keystorePassword);
}
}
}
@Bean
public EmbeddedServletContainerFactory servletContainer(TomcatSslConnector properties) {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
tomcat.addAdditionalTomcatConnectors(createSslConnector(properties));
return tomcat;
}
private Connector createSslConnector(TomcatSslConnector properties) {
Connector connector = new Connector();
properties.configureConnector(connector);
return connector;
}
}
四.启动springboot项目
启动完后会在日志中看到如下说明已经启动成功就可以通过https在默认的443端口或者http在默认的8081端口上来访问项
目了
2017-11-25 14:33:55.834 INFO 14395 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started
on port(s): 80 (http) 443 (https)
2017-11-25 14:33:55.838 INFO 14395 --- [ main] cn.flower.ApplicationBootstrap : Started
ApplicationBootstrap in 8.071 seconds (JVM running for 11.011)


作者: 陈文老师    时间: 2017-11-25 16:02
收藏~~~感谢分享
作者: 渝鱼鱼    时间: 2017-11-25 16:12
必须得收藏,很不错呢
作者: xiongliu    时间: 2017-11-26 15:48
秀秀老师棒棒哒!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2