我们运行一个带有 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.
但是,如果可能更改的证书与上次看到的证书具有相同的身份,则允许连接。
在这种情况下,两个身份被认为是相等的:
在其他情况下(证书的身份已更改),则会引发 javax.net.ssl.SSLHandshakeException: server certificate change is restricted during renegotiation 异常。
解决方法:
-Djdk.tls.allowUnsafeServerCertChange=true 它禁用不安全的服务器证书保护。无论如何,在调用 token_endpoint 验证身份验证以查看可能发生的情况之前,请使用您的 google oauth 客户端代码更新您的帖子。
关于java - 从 JVM 访问 token 端点时出现 Google 身份验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30509503/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/