到目前为止,我们编写的Web服务器,都是基于HTTP协议来实现的。
大家知道,HTTP协议是文本协议,而且是明文形式,很容易被嗅探窃听或攻击,安全性不太好。
其实,我们使用SpringBoot框架开发的基于HTTP的Web服务器,不需要进行编码修改,只需要稍稍配置,就可以变成基于HTTPS的Web服务器,极大提高系统的安全性。
我们还是从概念开始讲起吧。
HTTP,HyperText Transfer Protocol,超文本传输协议。
HTTP协议基于请求与响应在客户端和服务器端交互,HTTP是一种无状态的协议;
HTTP协议是因特网上应用最为广泛的应用层传输协议,可以用于传输html文件、图片、文本信息,还可以用于查询和修改服务器上的数据。
基于HTTP协议的Web系统的协议栈如下图所示:
SSL,Secure Sockets Layer,安全套接字协议;
TLS,Transport Layer Security,传输层安全协议;
TLS与SSL在传输层与应用层之间对网络连接进行加密,为网络通信提供安全及数据完整性。
HTTPS,Hyper Text Transfer Protocol over SecureSocket Layer,即HTTP over SSL,基于SSL的HTTP协议。
我们可以把HTTPS看作安全的HTTP协议。
基于HTTPS协议的Web系统的协议栈如下图所示:
下面我们用实际的例子,实现一个使用HTTPS的Web服务器。
我们使用IDEA,基于SpringBoot建立一个普通的Web服务器模块secure_web,使用了Lombok与Spring Web依赖,建立后的代码视图如下:
添加该类后,代码视图如下:
ShowMessageController类的源代码如下:
package com.flying.secure_web.controller;
import lombok.Data;
import org.springframework.web.bind.annotation.GetMApping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ShowMessageController{
@Data
private static class WebData{
private int errorCode;
private String message;
}
@GetMapping("/showMessage")
public WebData showMessage(){
WebData webData = new WebData();
webData.setErrorCode(0);
webData.setMessage("success");
return webData;
}
}
JDK提供了一个keytool工具,可以生成数字证书。
我们执行下面的命令,生成一个secure_web.key证书文件,该证书文件有效期为30天,使用RSA算法,密钥长度为2048,别名为secure_web:
keytool -genkey -alias secure_web -keyalg RSA -keysize 2048 -keystore secure_web.key -validity 30
输入命令时,设置密码为888888
下面是命令执行情况:
将生成的secure_web.key文件拷贝到resources目录中:
修改application.properties文件,添加HTTPS相关的属性。修改后的application.properties文件内容如下:
server.port=8188
server.ssl.key-store=resources/secure_web.key
server.ssl.key-alias=secure_web
server.ssl.key-store-password=888888
这四个配置项分别是Web服务的监听端口,数字证书文件名,生成证书时输入的别名和密码。
对程序编译,得到secure_web.jar软件,运行该程序:
在浏览器中输入 https://ip地址:8188/showMessage,浏览器会给出告警信息:
点击“高级”按钮,然后点击“继续前往<IP地址>(不安全)”:
将会得到从服务器返回的信息(JSON格式):
根据浏览器的提示信息,我们确实实现了基于HTTPS的安全Web服务器。