发布使用 HTTPS 运行的 Spring(非引导)应用程序

Posted

技术标签:

【中文标题】发布使用 HTTPS 运行的 Spring(非引导)应用程序【英文标题】:Release a Spring (not boot) application running with HTTPS 【发布时间】:2022-01-17 06:07:48 【问题描述】:

我尝试使用 GitHub 上的 Spring application 与 Azure B2C 建立 SAML 连接。 一切正常,直到我在本地运行,但是当我需要在生产环境中测试这个应用程序时,我发现自己遇到了由于 HTTPS 连接而出现的问题。

我的生产环境基于 AWS,我正在运行在反向代理中配置的 ECS 任务。我正在使用带有 HTTPS 侦听器和 HTTP 规则的负载均衡器在 HTTPS 上重定向。

此应用程序基于 Spring(不是 Spring Boot)并构建了一个我在 Tomcat 7 上运行的 WAR 文件。

当我尝试登录时,此应用程序尝试 ALB 重定向到 HTTPS 的 HTTP 请求,但此重定向使我的 SAML 工作流程无效。

我尝试将requires-channel="https" 添加到我的securityContext.xml 中的任何<security:intercept-url /> 节点,但是当我尝试在线访问应用程序时,我得到了一个ERR_TOO_MANY_REDIRECTS

我需要将 tomcat 和此应用程序配置为仅请求 HTTPS 而无需任何重定向,但我现在不知道如何

【问题讨论】:

【参考方案1】:

我最终分两步找到了解决方案。

第一步:我将我的 Tomcat 配置修改为仅适用于 https。

在 server.xml 中,我添加了一个与 TLS 配合使用的连接器

<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true" 
           maxThreads="150" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS"
           keystoreFile="conf/keystore.keystore"
           keystoreType="JKS"
           keystorePass="myStorePass"
           keyPass="myPass" />

然后我删除了 8080 到 443 的重定向。找到带有protocol="HTTP/1.1" 的节点连接器并将其删除。

第二步:我将负载均衡器修改为仅在具有 443 端口的 HTTS 中工作。为此,我必须在集群上创建一个新目标组和一个新服务。

【讨论】:

以上是关于发布使用 HTTPS 运行的 Spring(非引导)应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Amazon EMR + mrjob:引导错误,“引导操作 1 返回非零返回码”

获取非 Spring Java 应用的详细 Metrics 数据

Tomcat中部署的Spring引导应用程序中的@ExceptionHandler没有返回@ResponseBody

从 Node Js 重定向到 Spring 引导服务并发送回响应

如何将 Keycloak 与 Spring 集成(无引导)?

使 OpenJ9 类共享也共享非引导类