2017-04-26 121 views
0

这里是我的过程中,其中一个连接的堆栈跟踪:我已经把security.provider.1 = org.bouncycastle.jce.provider.BouncyCastleProvider,但它没有被SSL握手过程中使用

"ServerConnection on port 10000 Thread 27" #521 prio=5 os_prio=0 tid=0x0000000002db4800 nid=0x2d79 runnable [0x00007f0ababb1000] 
java.lang.Thread.State: RUNNABLE 
at java.net.SocketInputStream.socketRead0(Native Method) 
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) 
at java.net.SocketInputStream.read(SocketInputStream.java:171) 
at java.net.SocketInputStream.read(SocketInputStream.java:141) 
at sun.security.ssl.InputRecord.readFully(InputRecord.java:465) 
at sun.security.ssl.InputRecord.read(InputRecord.java:503) 
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973) 
- locked <0x00000006d63c51f0> (a java.lang.Object) 
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:930) 
at sun.security.ssl.AppInputStream.read(AppInputStream.java:105) 
- locked <0x00000006d6405210> (a sun.security.ssl.AppInputStream) 
at org.apache.geode.internal.cache.tier.sockets.Message.fetchHeader(Message.java:691) 
at org.apache.geode.internal.cache.tier.sockets.Message.readHeaderAndPayload(Message.java:709) 
at org.apache.geode.internal.cache.tier.sockets.Message.read(Message.java:657) 
at org.apache.geode.internal.cache.tier.sockets.Message.recv(Message.java:1105) 
- locked <0x00000006d6405288> (a java.nio.HeapByteBuffer) 
at org.apache.geode.internal.cache.tier.sockets.Message.recv(Message.java:1118) 
at org.apache.geode.internal.cache.tier.sockets.BaseCommand.readRequest(BaseCommand.java:869) 
at org.apache.geode.internal.cache.tier.sockets.ServerConnection.doNormalMsg(ServerConnection.java:723) 
at org.apache.geode.internal.cache.tier.sockets.ServerConnection.doOneMessage(ServerConnection.java:914) 
at org.apache.geode.internal.cache.tier.sockets.ServerConnection.run(ServerConnection.java:1171) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at org.apache.geode.internal.cache.tier.sockets.AcceptorImpl$1$1.run(AcceptorImpl.java:519) 
at java.lang.Thread.run(Thread.java:745) 

在这里,我猜,而不是sun.security.ssl我应该看到从弹性城堡库中使用的东西。

+0

添加弹性城堡安全提供程序将确保提供程序在运行时可用于JVM,但不能保证此提供程序将被使用。它基于您的代码中使用的密码。分享进行SSL连接的代码片段。 –

+0

这是一个第三方库。但考虑到提供者的优先权,不应该搜索这些密码吗? – mdavid

+0

它会但是如果代码中指定了不同的提供者呢?如果是第三方,您可以查看第三方代码(如果可用)。 –

回答

1

几件事:

1)你要添加哪个有弹性的城堡提供者? Bouncy城​​堡将JCE提供者和JSSE提供者打包在单独的jar中,并且必须使用单独的提供者类。 JSSE提供类是org.bouncycastle.jsse.provider.BouncyCastleJsseProvider和JCE提供者是org.bouncycastle.jce.provider.BouncyCastleProvider

2)是的,供应商在优先顺序抬头,但如上述响应中所述,返回哪个实现还取决于在应用程序代码中如何请求算法/协议。首先一个提供者应该实现你正在请求的算法/协议,并且它必须使用你在请求时使用的名称/别名来注册它。例如,如果代码正在请求TLS上下文作为javax.net.ssl.SSLContext.getInstance(“SSL”),则BC不会返回任何上下文,因为它不会使用该别名注册任何实现。但是,SunJSSE将返回一个上下文,因为它将“SSL”添加为“TLS”的别名。是的,您可以明确地向特定提供者请求实现。所有JCE/JSSE API都有一个额外的重载方法,它需要提供者名称。例如,

javax.net.ssl.SSLContext.getInstance(“TLS”,“BCJSSE”);

javax.net.ssl.KeyManagerFactory(“PKIX”,“BCJSSE”);