当前位置: 首页 > 知识库问答 >
问题:

在Spring Boot中将HTTP直接到代理后的HTTPS

谢华彩
2023-03-14

我有一个用Spring Boot(2.0.5)编写的服务器。它位于提供SSL的代理服务器后面。代理同时接受HTTP(80)和HTTPS(443),并将两者转发到我的服务器,该服务器只接受端口2222上的HTTP。代理设置以下请求标头。

    null

我在WebSecurityConfig类中测试了以下代码,但它没有工作。

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
     httpSecurity.requiresChannel().anyRequest().requiresSecure()
     .and().
     ...  
}

我还编写了以下代码将HTTP重定向到HTTPS。但它也会重定向HTTPS流量。但我只需要重定向HTTP。

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HttpsConfiguration {

    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {

            @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);
            }
        };
        return tomcat;
    }
}

我正在寻找一种方法来检查请求头,如果它是HTTP,我想将它重定向到HTTPS。

共有1个答案

呼延靖
2023-03-14

您提供的Spring Security配置应该可以工作。我猜问题是您没有正确设置Spring Boot与代理一起工作。要启用支持,应指定:

server.use-forward-headers=true

注意:如果您的应用程序运行在Cloud Foundry或Heroku中,server.use-forward-Headers属性默认为true。在所有其他情况下,它默认为false。

我会特别关注Tomcat的细节。这就是大多数人遇到问题的原因。Tomcat依赖于一个附加设置来确定内部代理IP地址是否与默认正则表达式匹配。如果代理的IP与regex不匹配,它会静默地忽略转发的报头。

如果您正在处理这方面的问题,请尝试指定以下内容:

server.tomcat.internal-proxies=.*

注意:其他应用程序服务器不关心代理IP地址,如果客户端可以欺骗X个转发的头,那么它也可以欺骗IP地址,所以开放到每个IP地址应该不会对您的应用程序产生影响。

 类似资料:
  • 问题内容: 最近,我一直在扭曲使用HTTP代理。经过反复试验,我想我终于可以正常工作了。我想知道的是,如果可能的话,如何扩展此代理以使其也能够处理HTTPS页面?到目前为止,这是我得到的: 如该代码所示,为了示例,我现在仅打印通过连接进行的操作。是否可以使用相同的类来处理HTTPS?如果没有,我应该如何实施这样的事情? 问题答案: 如果要通过HTTP代理连接到HTTPS网站,则需要使用HTTP动词

  • 先决条件 Apache Tomcat 7 Spring3.2.11。释放 Apache Camel 2.14.1 Camel HTTP4endpoint(Camel-HTTP4) 问题 我尝试通过http4组件调用https加密站点。位于我的服务器和Internet(目标服务器)之间的代理检查标头“User-Agent”并在请求为空时拒绝请求。 连接请求不包含http标头“User Agent”。

  • 我有一个应用程序有多个mongo配置。这是通过一些@Configuration类实现的,比如 配置1——应用程序 配置2--测试 然后在我的房子里 因此,两个mongo配置连接到本地运行但具有不同数据库的实例。我也尝试过使用不同的地址,但它的行为相同。 不管怎么说,这将通过实体和MongoRepository来使用 回购 然而,当我在某个地方的课堂上使用它时 此对象被写入,而不是我所期望的,因为它

  • 问题内容: 我在只能访问HTTP或袜子代理的网络上使用composer。我有http_proxy和https_proxy环境变量。当compose尝试访问HTTPS URL时,我得到以下信息: 据我所知,连接到https网站的唯一方法是使用连接动词。如何在此代理后面使用作曲家? 问题答案: 如果您使用的是Linux或Unix(包括OS X),则应将其放在会影响环境的位置: 您可以将其放入全局范围内

  • 我编写了一个SOCKS代理,如果关闭链接,它可以同时处理HTTP和HTTPS流量。 如果链接已打开并且转发主机和端口属于过滤HTTP代理,则只有HTTP流量可以流动。HTTPS流量不流动并报告SSL错误。 请注意,当请求直接来自浏览器而不是SOCKS服务器时,HTTP代理会处理HTTPS流量。 例如,如果我向https://www.google.com出现以下情况: 1)客户端发送SOCKS 5问

  • 在代理上使用HTTP隧道时,TCP套接字有问题。 客户端(C++)打开到服务器(JAVA)的TCP套接字。我添加了对HTTP代理的支持。一切正常,客户端发送“HTTP Connect”请求如下所示,并在以下情况下继续普通TCP连接: 然而,如果代理中配置了空闲超时,并且没有发送实际数据,则尽管客户端每60秒发送TCP保持活动数据包,但连接将终止。空闲超时配置为10分钟。