问题标签 [sslengine]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
9363 浏览

java - SSL 和 SocketChannel

理想情况下,我只需要一个简单的SSLSocketChannel.

我已经有一个组件可以通过普通方式读取和写入消息SocketChannel,但是对于其中一些连接,我必须通过网络使用 SSL;但是,对这些连接的操作是相同的。

有谁知道免费的SSLSocketChannel实现(使用适当的选择器)或类似的东西?我找到了这个,但是选择器不接受它,因为它的供应商不是 SUN。

我正在通过一个简单的对象将 read_from/writing_to 网络逻辑与网络数据的插入和检索解耦,以便在SSLEngine不生气的情况下使用 a ,但考虑到我不知道的事实,正确实现它真的很棘手SSL协议的内部...

0 投票
2 回答
2023 浏览

java - SSLEngine 并关闭

我已经实现了一个帮助模块,它让我从与 SSL 一起使用的通道中获取干净的数据并将加密数据写入其中:这是相关的接口(我在该类中也有一些非抽象方法,所以没有说对我来说,“DataProvider 应该是一个接口”;)):

我有一个用于 SSL 的抽象基类的实现。在测试该实现时,我编写了两个函数:在一个函数中,我收到一条带有 SocketChannel 的消息,用于发送数据的 SSLSocket 关闭连接,在另一个中,我使用 SocketChannel 发送一条消息,以此启动关闭。现在,问题是用于接收数据的 SSLSocket 没有关闭,即使我已经发布了这些步骤:

  1. engine.closeOutbound()
  2. engine.wrap()
  3. channel.write(data) (是的,我确定我已经发送了使用 wrap() 获得的所有数据
  4. 选择用于读取入站 close_notify 的通道

问题是选择器卡在第 4 步。

在另一个测试中(SSLSocket 关闭连接)我没有问题。

请注意,我已将 shouldClose 实现为:

所以我需要一个传入的 close_notify 才能关闭,即使我已经初始化了关闭(我不知道这是否正确:最终我可以用 更改它return engine.isOutboundDone()

这是我的 SSLSocket 端代码:

最后一个断言被违反。

最初我认为这是因为没有与 toRead 关联的“后台”线程,所以我应该对其进行读/写以消耗传入的内容close_notify,然后最终关闭套接字,但即使这样也没有帮助。

任何想法?

0 投票
1 回答
9842 浏览

java - Get SSLException form the SSLEngine Wrap method during handshake process

When I run the client Handshake process on my Java application in order to establish SSL connection, I get SSLException on the second call to the wrap method. I understand that in this point the client sends the CLientKeyExchange and ChangeCipherSpec to the server. The error message that I get from the exception is "General SSLEngine problem". Maybe there is a problem with my certificate that I need to send?

Here is the exception stack details:

Here is my code, the handshake starts on the Read method:

0 投票
2 回答
2133 浏览

java - 没有加密的 sslengine 密码套件


我在使用SSLEngineJava 时遇到了一个小问题。我用它来创建客户端和服务器之间的 SSL 连接。这不是基于 Web 的应用程序。

我正在为我的产品开发人员创建一个框架,以便在客户端和服务器之间进行通信。根据他们的配置,我必须创建连接。如果需要加密,我必须创建一个加密通道并将其提供给他们;如果没有,我只需要创建一个没有加密但带有消息摘要的 SSL 通道,所以我需要启用的密码套件是SSL_RSA_WITH_NULL_MD5. 如果需要加密,我将使用SSL_RSA_WITH_<some encryption algo>_SHA/MD5.

我能够配置第二个……但无法配置SSL_RSA_WITH_NULL_MD5. 它给了我一个例外 message No cypher suites in common。我用来开发这个的框架是 Netty(jboss-netty)。

任何人都可以帮我解决这个问题吗?

代码 ::

0 投票
1 回答
3276 浏览

android - 如何使用 websocket 和 socket.io 连接到 JAVA 中的 SSL?

java中如何访问wss://协议?

我使用 benkay / java-socket.io.client 但它不支持 wss 协议。

我尝试使用 SSLEngine。但这是非常艰苦的工作。

如何在java中连接到ssl?

我尝试通过 SSLEngine 更改 SocketChannel。但它不起作用。

ssl 频道没问题。但我无法连接这个原始的 websocket 部件。

这是源代码。

这一点不正确??我不知道.. 原来的 websocket 代码不一样.. 可能问题就是这一点。怎么解决?

和 SSLClient 是http://rapidant.tistory.com/attachment/cfile25.uf@121346414D45B0960BD01B.zip

密钥库:将 JKS 更改为 BKS,没问题。

如何包装 SocketChannel ?

(网络浏览器可以工作。)

0 投票
1 回答
9866 浏览

java - 使用自签名证书和 SSLEngine (JSSE) 的 SSL 握手

我的任务是实现一个自定义/独立的 Java 网络服务器,它可以在同一个端口上处理 SSL 和非 SSL 消息。

我已经实现了一个 NIO 服务器,它对于非 SSL 请求工作得很好。我在 SSL 部分玩得很开心,真的可以使用一些指导。

这是我到目前为止所做的。

为了区分 SSL 和非 SSL 消息,我检查入站请求的第一个字节,看它是否是 SSL/TLS 消息。例子:

在 parseTLS() 方法中,我像这样实例化 SSLEngine:

实例化 SSLEngine 后,我使用 unwrap/wrap 方法使用直接来自官方JSSE 示例的代码处理入站数据:

握手的第一部分似乎工作得很好。客户端发送握手消息,服务器响应带有 4 条记录的消息:

接下来,客户端发送一个包含三个部分的消息:

SSLEngine 解包客户端请求并解析记录,但 wrap 方法生成 0 个字节,握手状态为 OK/NEED_UNWRAP。换句话说,我没有任何东西可以发回给客户,握手就戛然而止。

这就是我卡住的地方。

在调试器中,我可以看到 SSLEngine,特别是 ServerHandshaker,没有找到任何对等证书。当我查看来自客户端的 0 字节长的证书记录时,这一点相当明显。但为什么?

我只能假设 HelloServer 响应有问题,但我似乎无法解决问题。服务器似乎正在发送一个有效的证书,但客户端没有发回任何东西。我的密钥库有问题吗?还是信任库?还是与我实例化 SSLEngine 的方式有关?我难住了。

其他几点:

  • 上面代码片段中引用的密钥库和信任库是使用以下教程创建的: http ://www.techbrainwave.com/?p=953
  • 我使用 Firefox 10 和 IE 9 作为客户端来测试服务器。两个 Web 客户端的结果相同。
  • 我正在使用 Sun/Oracle JDK 6 和与之捆绑的 Java 安全套接字扩展 (JSSE)。

我期待您的任何指导,但请不要告诉我我疯了或使用 Netty 或 Grizzly 或其他一些现有的解决方案。目前,它不是一个选择。我只是想了解我做错了什么。

提前致谢!

0 投票
1 回答
1393 浏览

java - 使用 JSSE SSLEngine 进行 SSL 会话管理

我正在使用 NIO 和 SSLEngine 开发 SSL Web 服务器。我能够成功处理握手并发送/接收应用程序数据。但是,我很难理解如何维护 SSL 会话状态。

我正在使用 Firefox 10 来测试我的网络服务器。在初始页面加载时,一切正常。握手成功完成。服务器处理客户端请求并发送回响应。响应干净利落,浏览器加载应用程序数据(html、图像等)。这是从客户端发送到服务器的消息的快照。

页面请求 #1

同样,在初始页面加载时,一切正常。但是,如果我刷新浏览器或转到另一个“页面”,Firefox 会发送应用程序记录而不是客户端问候。

页面请求 #2

在这种情况下,SSLEngine 在尝试解开应用程序数据时会引发异常。

我相信这是因为我正在为每个页面请求实例化一个新的 SSLEngine。如果我只实例化 SSLEngine 一次并将其设置为全局/静态变量,它会成功解开应用程序记录,并且我可以将响应发送回客户端。我可以刷新页面,访问其他页面等,没有任何问题。页面加载速度非常快,因为我们跳过了整个 ssl 握手过程。

不幸的是,如果我在所有这一切进行时从不同的浏览器(例如 IE 或 Safari)访问 Web 服务器,SSLEngine 内的会话状态将被破坏,我的 Web 服务器无法响应任何新的 SSL 请求。因此,一次实例化 SSLEngine 并使其成为全局可访问的静态变量似乎不是一个可行的选择。所以...

我到底应该如何响应第二个页面请求(页面请求#2)?除了 IP 地址之外,还有其他方法可以将第二个页面请求(页面请求 #2)与初始握手请求(页面请求 #1)联系起来吗?在第二个页面请求(页面请求#2)中的应用程序数据中是否有一个 SSL 会话 ID?

提前致谢!

0 投票
2 回答
2514 浏览

ssl - Netty ClientBootstrap SSL Handshake Terminates--Channel/ClientBootstrap closing?

My Connection to my test application keeps terminating in the same place without any errors.

I think perhaps something is triggering the channel/connection to close, but I don't know what it could be. Where exactly it closes changes slightly if I change printouts in the code, so the timing appears to be on a different thread.

I've been working on this for four days now and list myself as officially stuck.

Here is my connection code:

This is what my output looks like with SSL debugging enabled:

That's where it terminates. I've changed the printouts around a bit so that sometimes I also get one more line, the printout from logger.info("Connected to " + realRequest.getHost() + ":" + realRequest.getPort() + " " + realRequest.getUri()); but I really don't know what is causing it to shut down.

I tried overriding the netty SSLHandler and on all it's public operations added a printout, but the close(), channelConnected(), channelDisconnected(), etc methods are never being called. Neither is handshake().

My pipeline is set up to do a handshake:

My custom SSLHandler is really the same as the library's SslHandler, I just overrode the methods to add printouts before delegating to the super version.

It looks like the only thing being called on it is handleDownstream()

0 投票
4 回答
4125 浏览

android - Android SSLEngine 示例

我需要为我正在开发的应用程序使用基于 TLS 的 TCP 套接字。我已经经历了几十个例子,虽然我通过握手没有问题,但我似乎无法通过任何方式读取输入流(尝试了很多,包括 readline()、读取字符数组等)。每次我尝试时,应用程序都会在该位置冻结。如果我调试,它永远不会进入下一行代码。

在一个尝试的解决方案中,我决定转而使用 SSLEngine,因为这应该是 Java 1.5 对 java.nio 的 SSL 答案。但是,我发现了一个示例(此处:http ://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/samples/sslengine/SSLEngineSimpleDemo.java ),这有点令人困惑我,我还没有成功地实施它。当我尝试时, unwrap() 调用产生一个空缓冲区,我知道(通过在命令行上使用 OpenSSL)有问题的服务将数据推回管道。

欢迎提出建议,我已经在这方面花费了太多时间。以下是相关代码:

0 投票
1 回答
7055 浏览

java - 使用 SSLEngine (JSSE) 与旧客户端进行 SSL 握手

这是“使用自签名证书和 SSLEngine (JSSE)进行 SSL 握手”的后续问题。

我已经实现了一个 NIO Webserver,它可以在同一个端口上处理 SSL 和非 SSL 消息。为了区分 SSL 和非 SSL 消息,我检查入站请求的第一个字节,看它是否是 SSL/TLS 消息。例子:

在 parseTLS() 方法中,我实例化了一个 SSLEngine、启动握手、包装/解包消息等。对于大多数现代 Web 浏览器(Firefox 10、IE 9、Safari 5 等)来说,一切似乎都运行良好。

问题是 IE 6 等较旧的 Web 浏览器和 Java 的 URLConnection 类等库似乎以不同的方式启动 SSL/TLS 握手。例如,IE 6 的前几个字节看起来像这样(十六进制值):

如果我将消息传递给 SSLEngine,它似乎无法识别该消息并引发异常。

那么 IE 6 和 Java 的 URLConnection 类到底发送了什么?这是 JSSE SSLEngine 可以支持的有效 SSL/TLS 消息吗?我是否必须进行一些预处理或与客户端协商以发送不同的消息?

提前致谢!

更新

感谢 Bruno 和 EJP 以及一些进一步的调试,我对正在发生的事情有了更好的理解。正如布鲁诺正确指出的那样,IE6 和 Java 6 客户端通过 SSLv2 ClientHello 发送。与我之前的评论相反,Java 1.6 中的 SSLEngine 实际上可以解开 SSLv2 消息并生成有效响应以发送回客户端。我之前报告的 SSLException 是我这边的一个错误,与 SSLEngine 无关(我错误地认为客户端已完成发送数据,而当 SSLEngine 期望更多数据解包时,我最终得到一个空的 ByteBuffer)。