Tag: sslengine

如何在Java SSLEngine中设置自定义DH组以防止Logjam攻击?

对TLS的新Logjam攻击基于常见的DH组。 此链接建议为每个服务器生成一个新的自定义2048位DH组。 如何在使用SSLEngine的Java服务器代码中设置自定义DH组? ETA:如果我只使用短暂的DH密码套件,即使用DHE或ECDHE而不使用DH或ECDH的密码套件,我会安全吗? 或者这是无关的?

SSL和SocketChannel

理想情况下,我只需要一个简单的SSLSocketChannel 。 我已经有一个组件可以在普通的SocketChannel上读取和写入消息,但是对于其中一些连接,我必须通过线路使用SSL; 但是,这些连接上的操作是相同的。 有谁知道免费的SSLSocketChannel实现(使用适当的选择器)或类似的东西? 我发现了这个 ,但选择器不接受它,因为它的供应商不是SUN。 我正在通过一个简单的对象将read_from / writing_to网络逻辑从网络数据的插入和检索中解耦,以便使用SSLEngine而不会生气,但考虑到我不这样做,实现它是非常棘手的。知道SSL协议的内部……

SSLEngine unwrap()javax.crypto.BadPaddingException:坏记录MAC

这让我疯狂了好几天了。 我使用带有ssl加密的java nio创建了一个使用SSLEngine的客户端。 握手工作正常,我写了一个网站的GET请求,它工作正常(我得到200代码的标题)。 问题是当网站发回数据包时,在第二个数据包上我得到一个BadPaddingException。 这是我的阅读方法: public void read(SelectionKey key,ByteBuffer readBuffer) throws IOException, BadPaddingException { SocketChannel socketChannel = (SocketChannel) key.channel(); ByteBuffer clientSSLData = ByteBuffer.allocate(getPacketBufferSize()); System.out.println(“Reading data. PacketBufferSize: “+(getPacketBufferSize())); int length = socketChannel.read(clientSSLData); System.out.println(“read “+length+” bytes”); if (length == -1){ System.out.println(“Length is -1 which means nothing was read from the channel “); socketChannel.close(); return; } clientSSLData.flip(); […]

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

这是“ 使用自签名证书和SSLEngine(JSSE)进行SSL握手 ”的后续问题。 我已经实现了一个NIO Web服务器,可以在同一个端口上处理SSL和非SSL消息。 为了区分SSL和非SSL消息,我检查入站请求的第一个字节以查看它是否是SSL / TLS消息。 例: byte a = read(buf); if (totalBytesRead==1 && (a>19 && a<25)){ parseTLS(buf); } 在parseTLS()方法中,我实例化SSLEngine,启动握手,包装/解包消息等。对于大多数现代Web浏览器(Firefox 10,IE 9,Safari 5等),一切似乎都能正常工作。 问题是像IE 6这样的老式Web浏览器和Java的URLConnection类之类的库似乎以不同的方式启动SSL / TLS握手。 例如,IE 6的前几个字节看起来像这样(hex值): 80 4F 01 03 00 … 如果我将消息传递给SSLEngine,它似乎无法识别该消息并抛出exception。 javax.net.ssl.SSLException: Unsupported record version Unknown-0.0 那么IE 6和Java的URLConnection类究竟发送了什么呢? 这是JSSE SSLEngine可以支持的有效SSL / TLS消息吗? 我是否必须进行一些预处理或与客户协商以发送不同的消息? 提前致谢! UPDATE 感谢Bruno和EJP以及一些进一步的调试,我对正在发生的事情有了更好的理解。 正如Bruno正确指出的那样,IE6和Java 6客户端通过SSLv2 […]

Java JSSE SSLEngine无法恢复SSL会话

我正在编写一个使用SSLEngine和NIO的应用程序,我编写了客户端和服务器。 客户端能够连接到服务器,在他连接后,我希望他能够执行会话恢复/重新协商,但目前没有运气.. 由于使用SSLEngine的代码非常大(SSLEngine的使用非常复杂!),我将编写一个简单的伪代码来演示这种情况: Server: global sslcontext initialized once await new client client.sslEngine = create new server ssl engine using the global sslcontext client.handleHandshake and wait for it to be done handle client. Client: global sslcontext initialized once sslEngine = create new client ssl engine using the global sslcontext performHandshake and wait for it to be […]

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

我的任务是实现一个可以在同一端口上处理SSL和非SSL消息的自定义/独立Java Web服务器。 我已经实现了一个NIO服务器,它非常适用于非SSL请求。 我对SSL片段感到非常兴奋,并且可以使用一些指导。 这是我到目前为止所做的。 为了区分SSL和非SSL消息,我检查入站请求的第一个字节以查看它是否是SSL / TLS消息。 例: byte a = read(buf); if (totalBytesRead==1 && (a>19 && a<25)){ parseTLS(buf); } 在parseTLS()方法中,我实例化一个SSLEngine,如下所示: java.security.KeyStore ks = java.security.KeyStore.getInstance(“JKS”); java.security.KeyStore ts = java.security.KeyStore.getInstance(“JKS”); ks.load(new java.io.FileInputStream(keyStoreFile), passphrase); ts.load(new java.io.FileInputStream(trustStoreFile), passphrase); KeyManagerFactory kmf = KeyManagerFactory.getInstance(“SunX509”); kmf.init(ks, passphrase); TrustManagerFactory tmf = TrustManagerFactory.getInstance(“SunX509”); tmf.init(ts); SSLContext sslc = SSLContext.getInstance(“TLS”); sslc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); SSLEngine […]