1 配置SSL
1.1 SSL介绍
SSL
配置是我们在实际应用中经常见到的场景
SSL
(Secure Sockets Layer
,安全套接层)是为忘了通信提供安全及数据完整性的一种安全协议,SSL
在网络传送层对网络连接进行加密。SSL
协议位于TCP/IP
协议与各种应用层协议之间,为数据通信提供安全支持。
SSL
协议可分为两层:
-
SSL
记录协议(SSL Record Rrotocol
),它建立在可靠的传输协议(如TCP
)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持 -
SSL
握手协议(SSL Handshake Protocol
),它建立在SSL
记录协议之上,用于在实际数据传输开始前,通信双方进行身份认证、协商加密算法、交互加密密钥等
在基于B/S
的Web
应用中,是通过HTTPS
来实现SSL
的。HTTPS
是以安全为目标的HTTP
通道,简单讲是HTTP
的安全版,即在HTTP
下加入SSL
层,HTTPS
的安全基础是SSL
因为SpringBoot
用的是内嵌的tomcat
,因而我们做SSL
配置的时候需要做如下的操作
1.2 keytool生成证书
使用SSL
首先需要一个证书,这个证书既可以是自签名的,也可以是从SSL
证书授权中心获得的。
每一个JDK
或者JRE
里都有一个工具叫做keytool
,它是一个证书管理工具,可以用来生成自签名的证书
Keytool
是一个Java
数据证书的管理工具。Keytool
将密钥(key
)和证书(certificates
)存在一个称为keystore
的文件中在keystore
里,包含两种数据:
- 密钥实体(
Key entity
)——密钥(secret key
)又或者是私钥和配对公钥(采用非对称加密) - 可信任的证书实体(
trusted certificate entries
)——只包含公钥
keystore
使用命令:
keytool -genkey -alias tomcat -keyalg RSA
-keystore d:/mykeystore -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN" -keypass password
-storepass password -validity 36500
参数说明:
-
-genkey
表示要创建一个新的密钥 -
-dname
表示密钥的Distinguished Names
, CN=commonName
OU=organizationUnit ,O=organizationName
L=localityName ,S=stateName ,C=country
Distinguished Names
表明了密钥的发行者身份 -
-keyalg
使用加密的算法,这里是RSA
-
-alias
密钥的别名,每个keystore
都关联这一个独一无二的alias
,这个alias
通常不区分大小写 -
-keypass
私有密钥的密码,这里设置为password
-
-keystore
密钥保存在D:盘目录下的mykeystore
文件中,在没有制定生成位置的情况下,keystore
会存在与用户的系统默认目录, 文件名为.keystore
-
-storepass
存取密码,这里设置为password
,这个密码提供系统从mykeystore
文件中将信息取出 -
-validity
该密钥的有效期为36500
表示100
年 (默认为90
天)
1.3 cacerts证书
cacerts
证书文件(The cacerts Certificates File
)
改证书文件存在于java.home/lib/security
目录下,是Java
系统的CA
证书仓库
验证是否已创建过同名的证书
keytool -list -v -alias tomcat -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass password
1.4 springboot中配置
server.ssl.key-store=classpath:tomcat_rsa.keystore
server.ssl.key-alias=tomcat_rsa
server.ssl.key-store-type=JKS
server.ssl.key-store-password=123456
注意
:此处的classpath:tomcat_rsa.keystore
是从项目中的相对路径来查找的,也可以从绝对路径查找
1.5 报错ERR_SSL_VERSION_OR_CIPHER_MISMATCH
SpringBoot
配置ssl证书,访问提示ERR_SSL_VERSION_OR_CIPHER_MISMATCH
在生成*.keystore
时指定下 -keyalg RSA
可以避免此类问题
或者在配置中添加字段属性
server.ssl.ciphers=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_RC4_128_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
2 HTTP转向HTTPS
直接在浏览器地址栏里输入http
对应端口号,然后自动跳转到https
对应端口号
import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HttpConfig {
@Bean
public Connector httpContector(){
Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
connector.setRedirectPort(8000);
return connector;
}
@Bean
public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector){
TomcatServletWebServerFactory tomcat=new TomcatServletWebServerFactory(){
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint=new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection=new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(connector);
return tomcat;
}
}
启动成功后,可以见到
在这里插入图片描述
网友评论