2017-04-26 8 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

제 3 자 라이브러리입니다. 공급자의 우선 순위를 고려하여 해당 암호를 검색해서는 안됩니까? – mdavid

+0

다른 공급자가 코드에 지정되어 있으면 어떻게 될까요? 타사 인 경우 타사 코드 (있는 경우)를 볼 수 있습니다. –

답변

1

몇 가지 :

1) 추가 탄력이 성 제공? Bouncy Castle은 JCE 공급자와 JSSE 공급자를 별도의 jar로 패키지화하고 별도의 공급자 클래스를 사용해야합니다. JSSE 제공자 클래스는 org.bouncycastle.jsse.provider.BouncyCastleJsseProvider하고 JCE 공급자입니다 org.bouncycastle.jce.provider.BouncyCastleProvider

2) 예, 공급자가 우선 순위의 순서로 조회됩니다 만 위의 응답에서 언급했듯이 구현은 알고리즘/프로토콜이 응용 프로그램 코드에서 요청되는 방법에 따라 달라집니다. 먼저 공급자가 요청한 알고리즘/프로토콜을 구현해야하며 요청하는 동안 사용중인 이름/별칭을 사용하여 등록해야합니다.

예를 들어, 코드가 javax.net.ssl.SSLContext.getInstance ("SSL")와 같은 TLS 컨텍스트를 요청하면 BC는 해당 별칭을 사용하여 구현을 등록하지 않으므로 컨텍스트를 반환하지 않습니다. 그러나 SunJSSE는 "SSL"을 "TLS"의 별칭으로 추가하므로 컨텍스트를 반환합니다.

예. 특정 공급자의 구현을 명시 적으로 요청할 수 있습니다. 모든 JCE/JSSE API에는, 프로 바이더 명을 취하는 오버로드 된 메소드가 추가되고 있습니다. 예 :

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

javax.net.ssl.KeyManagerFactory ("PKIX", "BCJSSE");