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
配置的时候需要做如下的操作
使用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=commonNameDistinguished Names
表明了密钥的发行者身份-keyalg
使用加密的算法,这里是RSA
-alias
密钥的别名,每个keystore
都关联这一个独一无二的alias
,这个alias
通常不区分大小写-keypass
私有密钥的密码,这里设置为password
-keystore
密钥保存在D:盘目录下的mykeystore
文件中,在没有制定生成位置的情况下,keystore
会存在与用户的系统默认目录, 文件名为.keystore
-storepass
存取密码,这里设置为password
,这个密码提供系统从mykeystore
文件中将信息取出-validity
该密钥的有效期为 36500
表示100
年 (默认为90
天)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
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
是从项目中的相对路径来查找的,也可以从绝对路径查找
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
直接在浏览器地址栏里输入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;
}
}
启动成功后,可以见到
原文:https://www.cnblogs.com/jingzh/p/14917443.html