Spring Boot SSL(HTTPS)示例

Spring Boot SSL(HTTPS)示例

原文: https://howtodoinjava.com/spring-boot/spring-boot-ssl-https-example/

在此 SpringBoot 示例中,学习配置 Web 应用程序以使用自签名证书在 SSL(HTTPS)上运行。 也要学习创建 SSL 证书

不耐烦的 SSL 配置

Spring Boot 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 – 表示安全套接字层。 它是行业标准协议,用于通过保护在两个系统之间发送的所有敏感数据来保护 Internet 连接的安全,从而防止黑客读取和修改任何传输的信息。

TLS – (传输层安全性)是 SSL 的更新,更安全的版本。 它增加了更多功能。 如今,证书颁发机构提供的证书仅基于 TLS。 但是,关于网络上的安全通信,SSL 一词仍然很普遍,因为它很老,并且在社区中很流行。

HTTPS – 通过 SSL 证书保护网站时,URL 中显示(安全的超文本传输​​协议)。 它是 HTTP 协议的安全版本。

信任库和密钥库 – 用于在 Java 中存储 SSL 证书的证书,但它们之间没有什么区别。 truststore用于存储公共证书,而keystore用于存储客户端或服务器的私有证书。

创建自己的自签名 SSL 证书

要为我们的应用程序获取 SSL 数字证书,我们有两种选择:

  1. 创建一个自签名证书
  2. 为了从证书颁发机构(CA)获得 SSL 证书,我们将其称为 CA 证书。

为了今天的演示目的,我们将创建由 Java keytool命令生成的自签名证书。 我们需要在命令提示符下运行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 – 是将存储证书和公用/专用密钥的实际密钥库。 在这里,我们从 Java 密钥库使用 JKS,密钥库还有其他格式。

一旦执行了以上命令,它将要求某些信息,最后看起来像这样。

生成证书的keytool

至此,我们就需要生成证书。 这将在执行keytool命令的目录中生成ssl-server.jks密钥库文件,其中包含我们的自签名证书。

要查看此密钥库中的内容,我们可以再次使用keytool -list命令。

keytool -list -keystore ssl-server.jks

输出将类似于:

keytool -list选项

创建 Spring Boot 项目并配置 SSL

生成 Spring Boot 项目

SPRING 初始化器站点创建一个具有依赖项WebRest Repositories的 spring boot 项目。 选择依赖项并给出适当的 Maven GAV 坐标后,我们将获得压缩格式的下载选项。 下载框架项目,解压缩,然后将其作为 Maven 项目导入 eclipse 中。

Spring boot 项目生成

添加 REST 端点

为了进行测试,我们将使用一个简单的 REST 端点。 为此,请打开已生成的带有@SpringBootApplication注解的 spring boot 应用程序类,并添加此代码。 这将在服务器中公开一个带有相对 URL /secured的其余端点。

@RestController
class SecuredServerController{

	@RequestMapping("/secured")
	public String secured(){
		System.out.println("Inside secured()");
		return "Hello user !!! : " + new Date();
	}
}

这就是我们需要在应用程序中添加 Web 内容的全部。 您可以添加更多内容,例如添加页面,图像以创建功能完善的 Web 应用程序。

Spring Boot 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 所需要的。 很简单,对吧? 借助 SpringBoot,使一切变得非常容易。

示例

现在是时候通过命令mvn clean install进行最终的 Maven 构建,并通过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,从而使整个站点变得安全,这是一个可选步骤。 为此,在 SpringBoot 时,我们需要在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;
}

通过命令mvn clean install进行最终的 Maven 构建,然后启动应用程序。 测试 http://localhost:8080/secured。 它将自动重定向到 HTTPS 安全 URL。

总结

因此,今天我们了解了如何在 Spring Bean 应用程序中启用 HTTPS,并且还了解了如何将 HTTP 流量重定向至 HTTPS 。 我们还学会了创建自签名 SSL 证书

将我的问题放在评论部分。

下载源码

学习愉快!