SSL 加密传输
一、何为 SSL
- SSL,Secure Socket Layer,中文译为安全连接层,是为网络通信提供安全及数据完整性的一种安全协议,在网络传输层对网络链接进行加密;SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通信提供安全支持。
- SSL 协议分为两层:SSL 记录协议(SSL Record Protocol)和 SSL 握手协议(SSL Handshake Protocol)。
- SSL 记录协议,建立在可靠的传输协议之上,如 TCP,为高层协议提供数据封装、压缩、加密等基本功能的支持
- SSL 握手协议,建立在 SSL 记录协议之上,用于在实际数据开始传输前,通信双方进行身份认证、协商加密算法、交换加密密钥等。
二、SSL 证书生成
- 使用 SSL 需要一个证书,这里用的是自授权证书。
- JDK 或 JRE 为我们提供了一个用于生成证书的工具:keytool。
- 生成 SSL 证书以及相关配置的步骤如下:
1、生成 .keystore
- 首先先生成一个 .keystore 文件,这在项目中要用到,生成该文件的命令如下:
keytool -genkey -alias tomcat -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore D:\users\lenovo\Spring项目\tomcat.keystore -storepass 123456
- 命令中的路径可以修改为自己需要的路径
2、生成客户端证书
- 这里有两步,首先是生成一个 .p12 文件,其命令如下:
keytool -genkey -alias client -keypass 123456 -keyalg RSA -storetype PKCS12 -keypass 123456 -storepass 123456 -keystore D:\users\lenovo\Spring项目\client.p12
- 紧接着利用上面生成的文件,生成一个 .cer 文件
keytool -export -alias client -keystore D:\users\lenovo\Spring项目\client.p12 -storetype PKCS12 -keypass 123456 -file D:\users\lenovo\Spring项目\client.cer
3、生成服务器端证书
- 先让服务器端信任客户端证书,其命令如下:
keytool -import -v -file D:\users\lenovo\Spring项目\client.cer -keystore D:\users\lenovo\Spring项目\tomcat.keystore
- 在利用 .keystore 文件生成一个服务器证书
keytool -keystore D:\users\lenovo\Spring项目\tomcat.keystore -export -alias tomcat -file D:\users\lenovo\Spring项目\server.cer
4、安装证书
- 双击最后生成的那个 .cer 文件,按照指示安装证书。
5、具体步骤请阅读下面链接中的博文
- 以上操作我是参考博文
三、Spring Boot 项目简单实现 SSL
1、配置证书
- 首先要让 Spring Boot 支持 SSL,得先进行相关的配置。
- 把刚刚生成的 .keystore 文件复制到项目根目录。
- 在 application.properties 文件中增加如下代码:
server.ssl.key-store=tomcat.keystore server.ssl.key-store-password=123456 server.ssl.key-store-type=JKS server.ssl.key-alias=tomcat
2、运行项目
- 再次运行项目,则控制台相关关键信息如下图:
- 此时需要在浏览器(安装了相应证书的)地址栏输入:https:\localhost:8080\ 才能访问项目。
3、HTTP 自动跳转 HTTPS
- 大部分网站为了安全,即便用户用 http 头开始也会自动跳转到 https 去,要到达这样,需要在入口类中增加两个 Bean 进行相应的逻辑处理,代码如下:
@Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() { @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(httpConnector()); return tomcat; } @Bean public Connector httpConnector() { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); connector.setPort(8081); connector.setSecure(false); connector.setRedirectPort(8080); return connector; }
- 运行项目,控制台提示的局部关键信息如下:
- 从图可以看出,端口 8080 是 https,而端口 8081 是http,但当我们用 http 访问 8081 端口时,服务器会自动跳转到 https 的 8080 端口。
4、自定义网页 Tag 图标
- 正式运营的网站,其在浏览器中打开的标签页的标题栏都有自定义的 ICON,Spring Boot 支持对这个 ICON 进行设置。
- 在 Spring Boot 中,这个 ICON 称之为 favicon。
4.1、打开与关闭 Favicon
- Spring boot 是默认打开 Favicon 的;若要关闭 Favicon,则只需在 application.properties 文件中增加一句代码:
spring.mvc.favicon.enabled=false
- 保存,运行,则浏览器中的标签页不再显示个性化的 ICON,改为浏览器默认的图标:
4.2、自定义 Favicon
- 首先准备一个 .ico 文件,并且命名为 favicon.ico,只能是这个文件名。
- 将它放置在 resources 路径下。
- 再将 application.properties 文件中刚刚增加的那句代码的值改为 true。
- 运行,打开浏览器访问项目地址