gpt4 book ai didi

java - 从 JVM 访问 token 端点时出现 Google 身份验证错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:55:39 25 4
gpt4 key购买 nike

我们运行一个带有 JVM 后端的 Web 应用程序(Java 7 update 75;代码在 Scala 中,但我认为这不相关)。我们使用 Google 通过 Oauth 进行身份验证。

在过去几个月中,有几天我们间歇性地无法对用户进行身份验证。

进出 Google 的重定向是成功的,但是当我们尝试在 https://www.googleapis.com/oauth2/v4/token 调用 token_endpoint 时为了验证身份验证,我们有时会遇到以下异常:javax.net.ssl.SSLHandshakeException: server certificate change is restrictedduring renegotiation

这个对另一个问题的评论让我找到了一个 JDK 错误,它可以表现为这个异常(What means "javax.net.ssl.SSLHandshakeException: server certificate change is restrictedduring renegotiation" and how to prevent it?)。

我的工作假设是:

错误 (https://bugs.openjdk.java.net/browse/JDK-8072385) 意味着仅检查主题备用名称 (SAN) 列表中的第一个条目。当被验证的主机名在 SAN 列表中,但不在列表顶部时,将抛出上述异常。

昨天(2015 年 5 月 27 日,从 )我们看到 www.googleapis.com 间歇性地提供了两个不同的证书。第一个(序列号 67:1a:d6:10:cd:1a:06:cc)有一个 SAN 列表 DNS:*.googleapis.com, DNS:*.clients6.google .com, DNS:*.cloudendpointsapis.com, DNS:cloudendpointsapis.com, DNS:googleapis.com 而第二个(序列号 61:db:c8:52:b4:77:cf:78) 有一个 SAN 列表:DNS:*.storage.googleapis.com, DNS:*.commondatastorage.googleapis.com, DNS:*.googleapis.com

由于 JVM 中的错误,我们可以验证第一个证书,但第二个(尽管完全有效)会抛出异常,因为 *.googleapis.com 不是第一个条目在 SAN 列表中。

修复在尚未发布的 7u85 中(未提及何时可用)。

我已将集群的一个节点降级到 7u65,但证书似乎在我们执行此操作时恢复了(我们看到的最后一个错误是格林威治标准时间 22:20),因此很难确定肯定的修复。

除了降级(降级会删除各种其他 SSL/TLS 检查)之外,还有其他人遇到过这种情况或类似情况并且有任何其他解决方法吗?

最佳答案

我不确定您的问题是否与 JVM 错误有关。

Java 6 及更高版本中有针对 CVE-2014-6457 的修复,“针对 TLS/SSL 连接的三次握手攻击(JSSE,8037066)”,可防止在重新协商期间更改对等证书。

问题说明:

A security vulnerability in all versions of the Transport Layer Security (TLS) protocol (including the older Secure Socket Layer (SSLv3)) can allow Man-In-The-Middle (MITM) type attacks where chosen plain text is injected as a prefix to a TLS connection. This vulnerability does not allow an attacker to decrypt or modify the intercepted network communication once the client and server have successfully negotiated a session between themselves.

但是,如果可能更改的证书与上次看到的证书具有相同的身份,则允许连接。

在这种情况下,两个身份被认为是相等的:

  • 两个证书中都指定了一个主题备用名称,它是一个 IP 地址,并且两个证书中的 IP 地址相同。
  • 两个证书中都指定了一个主题备用名称,它是一个 DNS 名称,并且两个证书中的 DNS 名称相同。
  • 主题和颁发者字段出现在两个证书中并且包含相同的主题和颁发者值。

在其他情况下(证书的身份已更改),则会引发 javax.net.ssl.SSLHandshakeException: server certificate change is restricted during renegotiation 异常。

解决方法:

  • 禁用重新协商(不推荐)应用以下 JVM 参数:-Djdk.tls.allowUnsafeServerCertChange=true 它禁用不安全的服务器证书保护。
  • 在传出 HTTPS 连接中禁用 SSLv3Java 7 在客户端模式下支持 TLSv1.1 和 TLSv1.2,但在 TLS 握手中默认使用 TLSv1。我们也应该在 Java 7 的客户端模式 TLS 中使用 TLSv1.1 和 TLSv1.2。 Java 8 在客户端模式下启用 TLSv1.1 和 TLSv1.2(除了 SSLv3 和 TLSv1)并在 TLS 握手中默认使用 TLSv1.2。如果您以编程方式创建连接并设置套接字工厂,请使用 TLS 而不是 SSL。

无论如何,在调用 token_endpoint 验证身份验证以查看可能发生的情况之前,请使用您的 google oauth 客户端代码更新您的帖子。

关于java - 从 JVM 访问 token 端点时出现 Google 身份验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30509503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com