伙计们,我希望有一些显而易见的东西让我失踪,我希望有人能够解决一些问题.我试图让TLSv1.2在SSL + NIO上下文中运行(使用AndroidAsync库),所以我试图通过SSLEngine启用它.我可以运行这样的代码:
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, null, null);
String[] protocols = sslContext.getSupportedSSLParameters().getProtocols();
for (String protocol : protocols) {
Timber.d("Context supported protocol: " + protocol);
}
SSLEngine engine = sslContext.createSSLEngine();
String[] supportedProtocols = engine.getSupportedProtocols();
for (String protocol : supportedProtocols) {
Timber.d("Engine supported protocol: " + protocol);
}
Run Code Online (Sandbox Code Playgroud)
我最终在logcat上看到了这个:
06-22 21:56:27.715 1117-1117/? D/XXX? Context supported protocol: SSLv3
06-22 21:56:27.715 1117-1117/? D/XXX? Context supported protocol: TLSv1
06-22 21:56:27.725 1117-1117/? D/XXX? Context supported protocol: TLSv1.1
06-22 21:56:27.725 1117-1117/? D/XXX? Context …Run Code Online (Sandbox Code Playgroud) 理想情况下,我只需要一个简单的SSLSocketChannel.
我已经有一个组件可以读取和写入普通的消息SocketChannel,但对于其中一些连接,我必须通过线路使用SSL; 但是,这些连接上的操作是相同的.
有没有人知道一个免费的SSLSocketChannel实现(使用适当的选择器)或类似的东西?我发现了这个,但选择器不接受它,因为它的供应商不是SUN.
我正在通过一个简单的对象将read_from/writing_to网络逻辑与网络数据的插入和检索分离,以便使用SSLEngine而不会生气,但考虑到我不知道的事实,实现它是非常棘手的SSL协议的内部......
当为ssl/https连接配置apache2虚拟主机时,在添加配置并使用此命令启用配置"a2ensite pm.university.com.conf"后,我收到此错误"无效命令'SSLEngine',可能拼写错误或由模块定义包含在服务器配置中".我会回答我自己的问题.
我坚持创建一个SSLContext(我想用它来实例化一个SSLEngine来处理通过java-nio的加密传输):
代码
String protocol = "TLSv1.2";
Provider provider = new BouncyCastleProvider();
Security.addProvider(provider);
sslContext = SSLContext.getInstance(protocol,provider.getName());
Run Code Online (Sandbox Code Playgroud)
抛出以下异常:
Exception in thread "main" java.lang.RuntimeException: java.security.NoSuchAlgorithmException: no such algorithm: SSL for provider BC
at org.bitmash.network.tcp.ssl.SslTransferFactory.<init>(SslTransferFactory.java:43)
at org.bitmash.network.http.HttpsServer.<init>(HttpsServer.java:19)
Run Code Online (Sandbox Code Playgroud)
我将Bouncy Castle的当前提供程序包'bcprov-jdk15on-150.jar'(我从这里获得)附加到应用程序类路径以及它的bootclasspath(通过VM-Option -Xbootclasspath/p),但都没有解决问题.我也尝试了不同的值protocol(即'SSL'和'TLSv1')而没有任何影响.
此外,我发现这里和这里有类似问题的人.但与他们相比,我的目标(我正在使用)Java 7(或更高版本),但我仍然有这个问题.是这样 - 一般 - 甚至可以这样使用Bouncy Castle,或者我是否必须使用各自的API而不是oracle的NIO通过SSLEngine重写我的协议(这是我现在正在做的方式)?
非常感谢你们的帮助.
对TLS的新Logjam攻击基于常见的DH组.此链接建议为每个服务器生成一个新的自定义2048位DH组.
如何在使用SSLEngine的Java服务器代码中设置自定义DH组?
ETA:如果我只使用短暂的DH密码套件,即使用DHE或ECDHE而不使用DH或ECDH的密码套件,我会安全吗?或者这是无关的?
我的任务是实现一个可以在同一端口上处理SSL和非SSL消息的自定义/独立Java Web服务器.
我已经实现了一个NIO服务器,它非常适用于非SSL请求.我对SSL片段感到非常兴奋,并且可以使用一些指导.
这是我到目前为止所做的.
为了区分SSL和非SSL消息,我检查入站请求的第一个字节以查看它是否是SSL/TLS消息.例:
byte a = read(buf);
if (totalBytesRead==1 && (a>19 && a<25)){
parseTLS(buf);
}
Run Code Online (Sandbox Code Playgroud)
在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 serverEngine = sslc.createSSLEngine();
serverEngine.setUseClientMode(false);
serverEngine.setEnableSessionCreation(true);
serverEngine.setWantClientAuth(true);
Run Code Online (Sandbox Code Playgroud)
一旦SSLEngine被实例化,我使用unwrap/wrap方法使用直接来自官方JSSE Samples的代码处理入站数据:
log("----");
serverResult = serverEngine.unwrap(inNetData, inAppData);
log("server unwrap: ", serverResult);
runDelegatedTasks(serverResult, serverEngine);
log("----");
serverResult = serverEngine.wrap(outAppData, outNetData);
log("server wrap: ", …Run Code Online (Sandbox Code Playgroud) 我有一个线程,偶尔会在Message Hub上列出主题.但有一段时间,我得到了:无法发送SSL关闭消息.
有任何想法吗?
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(getConsumerConfiguration());
try {
Map<String, List<PartitionInfo>> topics = consumer.listTopics();
return new ArrayList<String>(topics.keySet());
} finally {
if (consumer != null) {
**consumer.close();**
}
}
Run Code Online (Sandbox Code Playgroud)
我收到了来自consumer.close的警告.
消费者的配置:
[WARN] 2018-01-25 20:12:23.204 [ClusterChannelMonitorTaskThread] org.apache.kafka.common.network.SslTransportLayer {} - 无法发送SSL关闭消息java.io.IOException:SSLEngine.wrap返回意外状态,预计CLOSED,收到OK.不会向同行发送密切消息.在org.apache.kafka.common.network.SslTransportLayer.close(SslTransportLayer.java:158)[kafka-clients-0.11.0.0.jar:?] at org.apache.kafka.common.utils.Utils.closeAll(Utils .java:663)[kafka-clients-0.11.0.0.jar:?] at org.apache.kafka.common.network.KafkaChannel.close(KafkaChannel.java:59)[kafka-clients-0.11.0.0.jar: ?] org.apache.kafka.common.network.Selector.doClose(Selector.java:582)[kafka-clients-0.11.0.0.jar:?] at org.apache.kafka.common.network.Selector.close (Selector.java:573)[kafka-clients-0.11.0.0.jar:?] at org.apache.kafka.common.network.Selector.close(Selector.java:539)[kafka-clients-0.11.0.0. jar:?] …
我正在使用java NIO编写服务器,我有几个问题,我无法找到答案.
首先,关于SSLEngine,如何NEED_TASK在分离的线程中正确处理?当我在单独的线程中调用任务时,他们完成了,但我不知道如何返回执行另一个握手操作.一种选择是从执行委派任务的线程调用该操作,但我想这不是这样做的方法.
另一个问题是interestOps()从不同的线程调用然后选择器线程.在尝试写入频道后没有写入所有数据后,我需要更改关键兴趣.我想过在ROX NIO教程中使用某种类型的更改队列,但我在另一个帖子中读到这不是最好的方法.
SSL握手完成后如何获取解码数据?
目前它似乎只解密了一些数据.
重现步骤
?GET ......#$?+ {??? u7Y ???
我在 springboot 应用程序中使用 webclient 来调用外部 Restful Web 服务。间歇性地出现此异常。
javax.net.ssl.SSLException: SSLEngine closed already SSLEngine closed already
Run Code Online (Sandbox Code Playgroud)
在收到此异常之前,我在日志中看到以下警告。
javax.net.ssl.SSLException:
at io.netty.handler.ssl.SslHandler.wrap (SslHandler.java854)
at io.netty.handler.ssl.SslHandler.wrapAndFlush (SslHandler.java811)
at io.netty.handler.ssl.SslHandler.flush (SslHandler.java792)
at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0 (AbstractChannelHandlerContext.java750)
at io.netty.channel.AbstractChannelHandlerContext.invokeFlush (AbstractChannelHandlerContext.java742)
at io.netty.channel.AbstractChannelHandlerContext.flush (AbstractChannelHandlerContext.java728)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.flush (CombinedChannelDuplexHandler.java531)
at io.netty.channel.ChannelOutboundHandlerAdapter.flush (ChannelOutboundHandlerAdapter.java125)
at io.netty.channel.CombinedChannelDuplexHandler.flush (CombinedChannelDuplexHandler.java356)
at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0 (AbstractChannelHandlerContext.java750)
at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush (AbstractChannelHandlerContext.java765)
at io.netty.channel.AbstractChannelHandlerContext.write (AbstractChannelHandlerContext.java790)
at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush (AbstractChannelHandlerContext.java758)
at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush (AbstractChannelHandlerContext.java808)
at io.netty.channel.DefaultChannelPipeline.writeAndFlush (DefaultChannelPipeline.java1025)
at io.netty.channel.AbstractChannel.writeAndFlush (AbstractChannel.java294)
at reactor.netty.http.HttpOperations.lambda$send$0 (HttpOperations.java123)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext (MonoFlatMap.java118)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext (FluxMapFuseable.java121)
at reactor.core.publisher.FluxContextStart$ContextStartSubscriber.onNext (FluxContextStart.java96)
at reactor.core.publisher.Operators$ScalarSubscription.request (Operators.java2344) …Run Code Online (Sandbox Code Playgroud) sslengine sslexception spring-boot reactor-netty spring-webclient
sslengine ×10
java ×7
ssl ×6
nio ×4
android ×1
apache ×1
apache-kafka ×1
bouncycastle ×1
jsse ×1
message-hub ×1
nio2 ×1
spring-boot ×1
sslexception ×1
virtualhost ×1