在这个Spring Boot示例中,学习将 Web 应用程序配置为使用自签名证书在 SSL (HTTPS) 上运行。还要学习创建 SSL 证书。
演示项目源码下载:(访问密码:9987)
spring-boot-ssl-server.zip
SSL 配置
Spring 启动 HTTPS 配置
server.port=8443
server.ssl.key-alias=selfsigned_localhost_sslserver
server.ssl.key-password=changeit
server.ssl.key-store=classpath:ssl-server.jks
server.ssl.key-store-provider=SUN
server.ssl.key-store-type=JKS
从 HTTP 重定向到 HTTPS
private Connector redirectConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
connector.setRedirectPort(8443);
return connector;
}
术语
在进一步讨论之前,让我们了解 SSL 或 TLS 等特定术语的含义。
SSL – 代表安全套接字层。它是通过保护在两个系统之间发送的所有敏感数据来保持互联网连接安全的行业标准协议,防止黑客阅读和修改任何传输的信息。
TLS –(传输层安全)是 SSL 的更新、更安全的版本。它增加了更多功能。如今,证书颁发机构提供的证书仅基于 TLS。但是对于网络上的安全通信,SSL 一词仍然很常见,因为它是旧的并且刚刚在社区中流行起来。
HTTPS –(安全超文本传输协议)在网站受 SSL 证书保护时出现在 URL 中。它是 HTTP 协议的安全版本。
Truststore 和 Keystore——它们用于在 Java 中存储 SSL 证书,但它们之间几乎没有区别。truststore
用于存储公共证书,而keystore
用于存储客户端或服务器的私有证书。
创建您自己的自签名 SSL 证书
要为我们的应用程序获取 SSL 数字证书,我们有两种选择——
- 创建自签名证书
- 要从证书颁发机构(CA)获得 SSL 证书,我们称之为 CA 证书。
对于今天的演示目的,我们将创建由 javakeytool
命令生成的自签名证书。我们需要keytool -genkey
从命令提示符运行命令。
这是我们将使用的确切命令 –
keytool -genkey -alias selfsigned_localhost_sslserver -keyalg RSA -keysize 2048 -validity 700 -keypass changeit -storepass changeit -keystore ssl-server.jks
让我们理解上面的命令——
-genkey
– 是用于生成证书的 keytool 命令,实际上 keytool 是一个多用途且强大的工具,它有多个选项-alias selfsigned_localhost_sslserver
– 表示证书的别名,用于 SSL/TLS 层-keyalg RSA -keysize 2048 -validity 700
– 是指示加密算法、密钥大小和证书有效性的自描述参数。-keypass changeit -storepass changeit
– 是我们信任库和密钥库的密码-keystore ssl-server.jks
– 是存储证书和公钥/私钥的实际密钥库。这里我们使用JKS fromat – Java Key Store,还有其他格式的密钥库。
一旦我们执行了上面的命令,它会询问某些信息,最后看起来像这样。
生成证书的keytool
这就是我们目前需要的关于认证生成的全部内容。这将ssl-server.jks
在执行 keytool 命令的目录中生成包含我们自签名证书的密钥库文件。
要查看此密钥库中的内容,我们可以再次使用如下keytool -list
命令。
keytool -list -keystore ssl-server.jks
输出将类似于 –
keytool -list 选项
创建 Spring-boot 项目并配置 SSL
生成spring boot项目
从SPRING INITIALIZR站点创建一个具有依赖项Web
和Rest Repositories
. 选择依赖项并提供正确的 maven GAV 坐标后,我们将获得压缩格式的下载选项。下载骨架项目,解压,然后在eclipse中作为maven项目导入。
Spring boot 项目生成
添加 REST 端点
出于测试目的,我们将使用一个简单的REST端点。为此,请打开已生成的带有注释的 Spring Boot 应用程序类@SpringBootApplication
并添加此代码。这将/secured
在服务器中公开一个具有相对 URL 的休息端点。
@RestController
class SecuredServerController{
@RequestMapping("/secured")
public String secured(){
System.out.println("Inside secured()");
return "Hello user !!! : " + new Date();
}
}
这就是我们在应用程序中添加 Web 内容所需的全部内容。您可以添加更多像添加页面、图像来创建功能齐全的 Web 应用程序。
Spring 启动 SSL 配置
首先,我们需要将生成的密钥库文件 ( ssl-server.jks
)复制到resources
文件夹中,然后打开application.properties
并添加以下条目。
server.port=8443
server.ssl.key-alias=selfsigned_localhost_sslserver
server.ssl.key-password=changeit
server.ssl.key-store=classpath:ssl-server.jks
server.ssl.key-store-provider=SUN
server.ssl.key-store-type=JKS
这就是我们启用 https 所需的全部内容。这很容易,对吧?感谢 spring boot 让一切变得很容易。
演示
现在是时候通过命令进行最后的 maven 构建并通过命令mvn clean install
启动应用程序了java -jar target/ssl-server-0.0.1-SNAPSHOT.jar
。这将在localhost 8443
端口中启动我们的安全应用程序,我们的端点 url 将是https://localhost:8443/secured。
由于我们的 REST 端点是通过 GET 公开的,因此我们只能通过浏览器对其进行测试。转到https://localhost:8443/secured,您将收到一些浏览器警告,例如未从受信任的证书颁发机构颁发证书,在浏览器中添加例外,您将收到来自您刚刚创建的 HTTPS 服务器的响应。
浏览器输出
将 HTTP 请求重定向到 HTTPS
如果您想将 HTTP 流量重定向到 HTTPS,则这是一个可选步骤,以便整个站点变得安全。要在 spring boot 中做到这一点,我们需要在8080
端口添加 HTTP 连接器,然后我们需要设置重定向端口8443
。这样任何8080
通过 http 的请求,都会自动重定向到8443
https。
为此,您只需要添加以下配置。
@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(redirectConnector());
return tomcat;
}
private Connector redirectConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
connector.setRedirectPort(8443);
return connector;
}
通过命令执行最终的 maven 构建mvn clean install
并启动应用程序。测试http://localhost:8080/secured。它将自动重定向到 HTTPS 安全 URL。
概括
所以今天我们学习了如何在 Spring Boot 应用程序中启用 HTTPS并且我们已经看到了如何将 HTTP 流量重定向到 HTTPS。我们还学习了创建自签名 SSL 证书。
演示项目源码下载:(访问密码:9987)
spring-boot-ssl-server.zip
原创文章,作者:carmelaweatherly,如若转载,请注明出处:https://blog.ytso.com/243849.html