- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有 100 个 HTTPS 服务在使用 SNI 的单个服务器上运行。 (实际上,我无权访问它们。这是一项任务。我所知道的只是它们的域名 N.xxx.yy
,其中 N 的范围是 00 到 99。)任务是评估与这些服务器中的每一个的每个连接的安全性。所以一些服务器包含过期的证书、CN 错误的证书等。
我的问题是我无法通过某些服务器上的握手。我已经使用 OpenSSL 在 C++ 中编写了自己的应用程序,但我也尝试过使用 openssl s_client
。这是我连接到服务器的方式:
openssl s_client -host N.xxx.yy -port 443 -verify 1 -servername N.xxx.yy -CAfile assignment-ca.pem
这就是我得到的:
139625941858168:error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error:s3_pkt.c:1493:SSL alert number 80
139625941858168:error:140790E5:SSL routines:ssl23_write:ssl handshake failure:s23_lib.c:177:
在 Wireshark 中,我看到客户端发送了 ClientHello
,服务器响应了 ServerHello
(选择 TLSv1.2 和 ECDHE-RSA-AES256-GCM-SHA384
) 后跟 Certificate
,然后它向我发送了包含 Internal Error (80)
的 Alert
消息。
在尝试了不同的方法之后我发现如果我使用 -tls1
或 -tls1_1
运行 s_client
我可以成功地通过握手. -tls1_2
不起作用。更奇怪的是,即使协商了 TLSv1.2,通过 Chrome/Firefox/任何其他浏览器的连接也会成功。据我所知,Chrome 发送的密码列表与我或 s_client
不同,但即使修改了密码列表以匹配 Chrome 中的密码列表(并确保服务器选择 ECDHE-RSA- AES128-GCM-SHA256
), 也不行。 Chrome 正在发送这些 TLS 扩展,我没有发送,但其中大部分似乎是空的:
Unknown 47802
renegotiation_info
Extended Master Secret
signed_certificate_timestamp
status_request
Application Layer Protocol Negotiation
channel_id
Unknown 6682
谁能给我解释一下这里发生了什么?不幸的是,我无法在服务器端调试它,所以这就是我所知道的。
更新:
在尝试伪造的 ClientHello
消息后,我设法将其追踪到 signature_algorithms
扩展。我的应用程序和 s_client
提供 SHA384 + {RSA,DSA,ECDSA}
但如果我删除这些并只保留 SHA256 + {RSA,DSA,ECDSA}
code>,就像 Chrome 一样,它可以正常工作,并且我成功收到了 Server Key Exchange
消息。会不会是服务器不支持它,而不是提供有意义的错误消息,它只是意外结束并给我这个内部错误?
更新 2:
我在 RFC5246 中找到了为什么它适用于 1.2 之前的 TLS 版本的答案。上一个更新的问题仍然存在。
Note: this extension is not meaningful for TLS versions prior to 1.2.
Clients MUST NOT offer it if they are offering prior versions.
However, even if clients do offer it, the rules specified in [TLSEXT]
require servers to ignore extensions they do not understand.
最佳答案
由于您写道 -tls1_2 不起作用
我假设您和/或服务器使用较旧的 openssl 库。写这篇文章时的当前版本是 1.1.0e
自 0.9.8 以来有很多修复,这些修复经常出现在旧系统上。
对于 Version 1.0.1有这个修复,听起来像你的问题:
`Some servers which support TLS 1.0 can choke if we initially indicate
support for TLS 1.2 and later renegotiate using TLS 1.0 in the RSA
encrypted premaster secret. As a workaround use the maximum permitted
client version in client hello, this should keep such servers happy
and still work with previous versions of OpenSSL.`
也许还有notable :
不允许在 TLS 1.0、1.1 连接中使用 TLS 1.2 SHA-256 密码套件。
所以我建议更新您的 openssl 版本,如果服务器超出您的控制范围,我会坚持使用您已经找到的设置。
关于ssl - OpenSSL 连接 : alert internal error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43436412/
这个问题在这里已经有了答案: How to make a property protected AND internal in C#? (8 个答案) 关闭 9 年前。 我需要声明一个既受又 内部保
我对在 Kotlin 1.3 中使用 Strings.isNullOrEmpty 导入 jdk.internal.joptsimple.internal.Strings.isNullOrEmpty 的
我有一个项目,实习生单元测试应该位于与被测源代码不同的目录树中。有点像这样: projectRoot projectRoot/src projectRoot/tests projectRoot/tes
如何在功能测试中访问浏览器的主要 JavaScript 范围?例如,我想获取对 Dojo 小部件的引用并检查它的属性。例如,在浏览器 JavaScript 控制台中,我可以运行: dijit.
public class TestClass { protected internal int FieldA; internal protected int FieldB; }
我想创建一个内部自动属性: internal bool IP { get; protected internal set; } 我认为可以使 setter protected 或 protected
java.lang.NoSuchMethodError: okhttp3.internal.Internal.initializeInstanceForTests() When creating a
我正在尝试使用 intern 来测试在 node.js 下运行的 dojo 应用程序 我的 intern.js 配置文件是这样的: define({ loader: {
我在 Raspbian wheezy 上的 nginx 1.2.1-2.2 有点问题。我认为它是在我更改站点可用/默认文件中的索引后开始的。以下是相关文件: nginx.conf user www-d
我在尝试加载 Visual studio 2012 时遇到了此错误,遇到了异常。这可能是由扩展引起的,并且在 C:\Users\~\AppData 中给出了附加信息的位置\Roaming\Micros
我正在将一个项目迁移到 Java9,在我切换到新的 Java 版本后,测试开始失败,看起来 PowerMock 正在尝试访问一些它无法访问的类。 Tests run: 1, Failures: 0,
该触发器用于检测进度中的顺序是否已更新,并有助于更新进度的概览状态和完成时间。 但是当发生内部错误时,它并不总是有效,如下所示: Error: 13 INTERNAL: An internal err
当我尝试将包含一些 JavaScript 的项目导入工作区时(使用 Eclipse 的 Neon.M6 版本),出现此错误: eclipse.buildId=4.6.0.I20160317-0200
我在尝试访问 FullContact API 服务器时收到此错误。我正在使用 okhttp 2.7.5 和 okhttp-urlconnection 2.7.5 以及改造 1.9.0。 Caused
当我试图读取一个以前版本的 pandas 保存的 pickle 文件时,它产生了一个 ImportError。 ImportError: No module named 'pandas.core.in
我正在将一个项目迁移到 Java9,在我切换到新的 Java 版本后测试开始失败,似乎 PowerMock 正在尝试访问它无法访问的一些类。 Tests run: 1, Failures: 0, Er
我正在尝试设置 Lumen - 建立在 Laravel 组件之上的“微框架”。服务器端有 nginx + php-fpm。 这是我的 nginx 配置: server { server_nam
在我们的项目中,我们决定在我们的项目中使用最新的 fmt 版本 (6.2.0) 并主要使用 printf 功能,因为我们在广泛使用 printf 的地方进行日志记录。 我使用 fmt 包中包含的 CM
我正在使用 Mockito jar 为 Groovy 编写 Junit 测试用例,但它给了我以下异常: java.lang.NoSuchMethodError: org.mockito.interna
我们的应用程序使用 Google 集合中的 MapMaker 类,并且我们遇到了以下异常,但仅限于使用 webstart 的 OS X 10.4。从应用程序包启动时以及在 OS X 10.5 和 Wi
我是一名优秀的程序员,十分优秀!