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

使用Spring Cloud OAuth2的SSL/代理问题

微生阳平
2023-03-14

我改编了以下OAauth2 Spring云示例:

Authserver/SSO

我所做的唯一更改是在Authserver端使用JPA检查数据库中的凭据。除了在nginx代理后部署它之外,其他一切都很好。在上面的示例应用程序中,使用了Spring Boot和嵌入式Tomcat。我还正确配置了代理标头:

server.tomcat.protocol-header=X-Forwarded-Proto
server.tomcat.remote-ip-header=X-Real-IP

代理HTTP正在工作:

accessTokenUri: http://uaa.sample.com/oauth/token
userAuthorizationUri: http://uaa.sample.com/oauth/authorize

到目前为止还不错,但我需要使用SSL(显然):

accessTokenUri: https://uaa.sample.com/oauth/token
userAuthorizationUri: https://uaa.sample.com/oauth/authorize

如果我切换到SSL,在授权服务器重定向回授权后,我从客户端应用程序获得401。我捕获的HTTP流量和一切似乎工作:

  • 获取对客户端应用程序的请求

HTTP和HTTPS的HTTP流量是完全相同的,除了HTTP为最后一个请求设置了适当的引用(AFAIK,在OAuth身份验证期间没有检查引用,对吗?):

HTTP:

GET /login?code=212eRK&state=9prwi2 HTTP/1.1
Host: test.sample.com
...
Referer: http://uaa.sample.com/login
Cookie: JSESSIONID=401EB8D1D1F4297160D518EC253A0CB5; XSRF-TOKEN=95a00a0d-3362-4e9b-b7eb-45addf2d10b4
...

---
HTTP/1.1 302 Found

HTTPS:

GET /login?code=212eRK&state=9prwi2 HTTP/1.1
Host: test.sample.com
...
Cookie: JSESSIONID=401EB8D1D1F4297160D518EC253A0CB5; XSRF-TOKEN=95a00a0d-3362-4e9b-b7eb-45addf2d10b4
...

---
HTTP/1.1 401 Unauthorized

来自客户端应用程序的相应日志消息:

Authentication request failed: org.springframework.security.authentication.BadCredentialsException: Could not obtain access token.

任何想法为什么使用代理和SSL不工作?我很高兴分享更多的代码和/或日志输出!

谢谢!!!

共有3个答案

方坚壁
2023-03-14

这可能是值得仔细看看为什么BadCre的异常是冒泡,我的意思是逐步通过Spring SecurityOAuth2代码与您的调试器。

我之所以这样说,是因为根据我的经验,BadCredentialsException可能是由一个潜在的InvalidRequestException引起的,以下是违规的一行:

throw new InvalidRequestException(
                "Possible CSRF detected - state parameter was required but no state could be found"); 

我在这里就上述问题提出了一个单独的问题:

为什么AccessTokenRequest的PreservedState永久为空,并产生与CSRF相关的InvalidRequestException?

因此,就您的情况而言,对于新引入的nginx代理,我只是想知道您是否看到了一个误导性的异常。也就是说,在oauth2和SpringSecurityOAuth2方面,将CSRF作为额外的复杂性来处理会误导未经培训的人。

仲孙景胜
2023-03-14

可能有点晚了,但我遇到了完全相同的事情。

我的安装程序是一个使用Spring oAuth2执行SSL代理到运行的Spring Boot应用程序的NGINX。

要在nginx config中解决此问题

 proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;  
 proxy_set_header X-Forwarded-Proto  $scheme;  

这是你Spring的application.yml

 server.tomcat.remote_ip_header: X-Forwarded-For
 server.tomcat.protocol_header: X-Forwarded-Proto
 security.require_ssl: true

来源:http://docs.spring.io/spring-boot/docs/current/reference/html/howto-security.html#howto-enable-https

现在,Spring检测到正确的URL,并发出请求。getRequestURL现在返回正确的URL,包括https://

 @Controller
 public class HomeController {
     @RequestMapping("/")
     @ResponseBody
     public String rootLandingPage(HttpServletRequest request) throws Exception {
         return "url: " + request.getRequestURL();
     }
 }
钱澄邈
2023-03-14

SSO应用程序尝试将身份验证代码交换为令牌时,似乎失败了。在此之前的所有步骤都是浏览器重定向,这是SSO服务器上试图调用身份验证服务器的代码。身份验证服务器上的SSL证书使用什么?它们是否由Java信任存储中具有CA的受信任方签名?如果不是,这可能就是它失败的原因,因为BadCredentialsException是底层HTTP请求失败的最终结果。

另一个选项是,没有直接从SSO服务器到身份验证服务器地址的路由。

我相信最终将由ApacheCommonsHttpClient代码来处理请求,因此您应该尝试对这些类(org.Apache.http)进行调试,并查看它报告了什么。

 类似资料:
  • 我刚刚下载了Maven,并尝试运行“Maven in Five minutes”页面(http://Maven.apache.org/guides/getting-start/maven-in-five-minutes.html)上的简单命令。这是命令: 当我运行它时,我得到一个SSL证书错误,无法从https://repo.Maven.apache.org/maven2的中央Maven存储库下载

  • 问题内容: 我刚下载了Maven,并试图运行在“五分钟内的Maven”页面(http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html)中找到的简单命令。这是命令: mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -D

  • 我已经在预打包的jetty服务器前面安装了http反向代理。jetty服务器是预配置的应用程序,不太灵活。此Jetty服务器将只接受SSL请求。 我将nginx配置为使用自己的SSL证书在443上侦听SSL流量。然后在nginx后面,我在另一台运行jetty服务器的机器上有另一台服务器,在端口443上有自己的证书。 我的Nginx配置如下所示, 如果我在https上点击jetty服务器,就会得到一

  • 我将Jetty的HttpClient设置为使用SSL连接到apache http server,它将请求作为http路由到web服务器: HttpClient<--HTTPS->http server<--HTTP->web服务器。 此安装程序已运行了一段时间。 我现在正在尝试添加代理: HttpClient<---HTTPS using CONNECT Method-->proxy<---HTT

  • 我目前正在使用SSL身份验证配置Apache Kafka,在启动服务时遇到错误。代理程序似乎启动正确(似乎发生了领导人选举等),但一旦开始执行任何集群操作,我就会在日志中不断看到下面的错误。 尝试重新创建密钥和信任存储,尝试从代理间侦听器中删除SSL(这会导致匿名主体,我不想授予对任何资源的访问权)。 要解释我的配置: 使用SSL principal builder运行Kafka 2.2 我设置了

  • 问题内容: 我想通过多个客户端子进程将数据从客户端发送到TLS TCP套接字中的服务器,因此我与所有子进程共享相同的ssl套接字。通信可以使用一个子进程,但是如果我使用多个子进程,则TLS服务器将崩溃,并显示(SSL3_GET_RECORD:decryption失败或mac记录错误)。 更具体地说: 它不依赖于哪个进程首先调用该方法,但是此进程是此后唯一可以调用该方法的进程。如果另一个进程调用,服