SSLHandshakeException:收到致命警报:在Java 6 – > 8升级后的handshake_failure

我们最近更新了一个从Java 6到Java 8的项目,现在我们已经打了一个关于SSL握手的问题。

服务层使用客户端来请求和接收来自第三方应用程序的呼叫。 在服务层中,使用初始化密钥库

System.setProperty("javax.net.ssl.trustStore", keyStoreFile); System.setProperty("javax.net.ssl.trustStorePassword", keyStorePassword); 

并通过applicationContext.xml注入:

    

奇怪的是:1。显然,这不是一个完整的文件路径。 2.此服务器上没有密钥库(无论Java 6如何,它都可以工作)。

如果出现错误,客户端应该信任所有证书:

 /** * Sets a trust manager that ignores the certificate chains. Use if the * server has a certificate that can't be verified. * */ private void trustHttpsCertificates() throws Exception { try { Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); // Create a trust manager that does not validate certificate chains TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } public void checkServerTrusted(X509Certificate[] certs, String authType) { } public void checkClientTrusted(X509Certificate[] certs, String authType) { } }}; // Ignore differences between given hostname and certificate hostname HostnameVerifier hv = new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }; // Install the all-trusting trust manager SSLContext sc = SSLContext.getInstance("TLSv1"); //$NON-NLS-1$ sc.init(null, trustAllCerts, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); HttpsURLConnection.setDefaultHostnameVerifier(hv); } catch (KeyManagementException e) { String errorMsg = "client initialization error: " //$NON-NLS-1$ + e.getMessage(); log.error(errorMsg); throw new Exception(errorMsg, e); } } 

SSLContext.getInstance( “使用TLSv1”); 曾经是getInstance(“SSL”); 但我不认为Java 8上支持SSL,所以我将其更改为TLSv1。 可能有问题吗?

调试日志

 Allow unsafe renegotiation: false Allow legacy hello messages: true Is initial handshake: true Is secure renegotiation: false http-nio-9080-exec-6, setSoTimeout(0) called Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 for TLSv1 Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 for TLSv1 Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256 for TLSv1 Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 for TLSv1 Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 for TLSv1 Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 for TLSv1 Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 for TLSv1 Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 for TLSv1.1 Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 for TLSv1.1 Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256 for TLSv1.1 Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 for TLSv1.1 Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 for TLSv1.1 Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 for TLSv1.1 Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 for TLSv1.1 %% No cached client session *** ClientHello, TLSv1.2 RandomCookie: GMT: 1423711122 bytes = { 237, 188, 53, 112, 79, 112, 248, 92, 164, 127, 178, 34, 205, 40, 245, 25, 77, 143, 116, 126, 203, 96, 61, 181, 114, 148, 66, 227 } Session ID: {} Cipher Suites: [TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_DSS_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV] Compression Methods: { 0 } Extension elliptic_curves, curve names: {secp256r1, sect163k1, sect163r2, secp192r1, secp224r1, sect233k1, sect233r1, sect283k1, sect283r1, secp384r1, sect409k1, sect409r1, secp521r1, sect571k1, sect571r1, secp160k1, secp160r1, secp160r2, sect163r1, secp192k1, sect193r1, sect193r2, secp224k1, sect239k1, secp256k1} Extension ec_point_formats, formats: [uncompressed] Extension signature_algorithms, signature_algorithms: SHA512withECDSA, SHA512withRSA, SHA384withECDSA, SHA384withRSA, SHA256withECDSA, SHA256withRSA, SHA224withECDSA, SHA224withRSA, SHA1withECDSA, SHA1withRSA, SHA1withDSA, MD5withRSA *** [write] MD5 and SHA1 hashes: len = 237 0000: 01 00 00 E9 03 03 55 DC 1C 92 ED BC 35 70 4F 70 ......U.....5pOp 0010: F8 5C A4 7F B2 22 CD 28 F5 19 4D 8F 74 7E CB 60 .\...".(..Mt.` 0020: 3D B5 72 94 42 E3 00 00 64 C0 24 C0 28 00 3D C0 =.rB..d.$.(.=. 0030: 26 C0 2A 00 6B 00 6A C0 0A C0 14 00 35 C0 05 C0 &.*.kj....5... 0040: 0F 00 39 00 38 C0 23 C0 27 00 3C C0 25 C0 29 00 ..9.8.#.'.<.%.). 0050: 67 00 40 C0 09 C0 13 00 2F C0 04 C0 0E 00 33 00 g.@...../.....3. 0060: 32 C0 2C C0 2B C0 30 00 9D C0 2E C0 32 00 9F 00 2.,.+.0.....2... 0070: A3 C0 2F 00 9C C0 2D C0 31 00 9E 00 A2 C0 08 C0 ../...-.1....... 0080: 12 00 0A C0 03 C0 0D 00 16 00 13 00 FF 01 00 00 ................ 0090: 5C 00 0A 00 34 00 32 00 17 00 01 00 03 00 13 00 \...4.2......... 00A0: 15 00 06 00 07 00 09 00 0A 00 18 00 0B 00 0C 00 ................ 00B0: 19 00 0D 00 0E 00 0F 00 10 00 11 00 02 00 12 00 ................ 00C0: 04 00 05 00 14 00 08 00 16 00 0B 00 02 01 00 00 ................ 00D0: 0D 00 1A 00 18 06 03 06 01 05 03 05 01 04 03 04 ................ 00E0: 01 03 03 03 01 02 03 02 01 02 02 01 01 ............. http-nio-9080-exec-6, WRITE: TLSv1.2 Handshake, length = 237 [Raw write]: length = 242 0000: 16 03 03 00 ED 01 00 00 E9 03 03 55 DC 1C 92 ED ...........U.... 0010: BC 35 70 4F 70 F8 5C A4 7F B2 22 CD 28 F5 19 4D .5pOp.\...".(..M 0020: 8F 74 7E CB 60 3D B5 72 94 42 E3 00 00 64 C0 24 .t..`=.rB..d.$ 0030: C0 28 00 3D C0 26 C0 2A 00 6B 00 6A C0 0A C0 14 .(.=.&.*.kj... 0040: 00 35 C0 05 C0 0F 00 39 00 38 C0 23 C0 27 00 3C .5.....9.8.#.'.< 0050: C0 25 C0 29 00 67 00 40 C0 09 C0 13 00 2F C0 04 .%.).g.@...../.. 0060: C0 0E 00 33 00 32 C0 2C C0 2B C0 30 00 9D C0 2E ...3.2.,.+.0.... 0070: C0 32 00 9F 00 A3 C0 2F 00 9C C0 2D C0 31 00 9E .2...../...-.1.. 0080: 00 A2 C0 08 C0 12 00 0A C0 03 C0 0D 00 16 00 13 ................ 0090: 00 FF 01 00 00 5C 00 0A 00 34 00 32 00 17 00 01 .....\...4.2.... 00A0: 00 03 00 13 00 15 00 06 00 07 00 09 00 0A 00 18 ................ 00B0: 00 0B 00 0C 00 19 00 0D 00 0E 00 0F 00 10 00 11 ................ 00C0: 00 02 00 12 00 04 00 05 00 14 00 08 00 16 00 0B ................ 00D0: 00 02 01 00 00 0D 00 1A 00 18 06 03 06 01 05 03 ................ 00E0: 05 01 04 03 04 01 03 03 03 01 02 03 02 01 02 02 ................ 00F0: 01 01 .. [Raw read]: length = 5 0000: 15 03 01 00 02 ..... [Raw read]: length = 2 0000: 02 28 .( http-nio-9080-exec-6, READ: TLSv1 Alert, length = 2 http-nio-9080-exec-6, RECV TLSv1.2 ALERT: fatal, handshake_failure http-nio-9080-exec-6, called closeSocket() http-nio-9080-exec-6, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure [2015-08-25 09:43:14:014 CEST] ERROR [http-nio-9080-exec-6][] snod.SnodPKClient: Failed to request and read response from snod: Received fatal alert: handshake_failure [2015-08-25 09:43:14:014 CEST] ERROR [http-nio-9080-exec-6][] snod.SnodPKClient: Failed to request SNOD information: Failed to request and read response from snod: Received fatal alert: handshake_failure [2015-08-25 09:43:14:014 CEST] WARN [http-nio-9080-exec-6][] snod.SnodException: Failed to request and read response from snod: Received fatal alert: handshake_failure at xx.xx.SnodClient.queryService(SnodClient.java:151) at xx.xx.SnodPKClient.fetchPerson(SnodPKClient.java:169) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:610) at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:68) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) at com.sun.proxy.$Proxy81.pop(Unknown Source) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:711) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:68) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644) at xx.xx.Service$$EnhancerBySpringCGLIB$$f31df72a.get() at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:711) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:610) at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:68) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.ws.server.endpoint.MethodEndpoint.invoke(MethodEndpoint.java:134) at org.springframework.ws.server.endpoint.adapter.MarshallingMethodEndpointAdapter.invokeInternal(MarshallingMethodEndpointAdapter.java:141) at org.springframework.ws.server.endpoint.adapter.AbstractMethodEndpointAdapter.invoke(AbstractMethodEndpointAdapter.java:55) at org.springframework.ws.server.MessageDispatcher.dispatch(MessageDispatcher.java:236) at org.springframework.ws.server.MessageDispatcher.receive(MessageDispatcher.java:176) at org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection(WebServiceMessageReceiverObjectSupport.java:89) at org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter.handle(WebServiceMessageReceiverHandlerAdapter.java:61) at org.springframework.ws.transport.http.MessageDispatcherServlet.doService(MessageDispatcherServlet.java:293) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863) at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2023) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1125) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1512) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440) at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338) at xx.xx.SnodClient.httpRequestCheck(SnodClient.java:339) at xx.xx.SnodClient.queryService(SnodClient.java:140) ... 97 more 

思考

与使用Java 6的旧版本相比,主要有两个突出的东西:

  1. 在旧版本的日志中,当成功尝试时,它会清晰地显示正确的证书:

证书

 http-9080-1, READ: TLSv1 Handshake, length = 1375 *** Certificate chain chain [0] = [ [ Version: V3 Subject: CN=Janus, OU=Janus Snod Server, O=Media Communications Eur AB (publ), L=Stockholm, ST=Stockholms Lan, C=SE Signature Algorithm: MD5withRSA, OID = 1.2.840.113549.1.1.4 Key: Sun RSA public key, 1024 bits modulus: 154938606312449178696821964101723049260345574724508497470358703346529895346419731715548240827139735285491863427521115606880526282651126615234990610880260841123741428540874639484268039421250487320597319639022576052540499319669985035693206002281790184516249920955711188003336296074244648385317324358551590420109 public exponent: 65537 Validity: [From: Wed May 26 14:31:31 CEST 1999, To: Thu May 25 14:31:31 CEST 2000] Issuer: CN=SnodServer25, OU=SnodServer, O=Media Communications Eur AB (publ), L=Stockholm, ST=Stockholms Lan, C=SE SerialNumber: [ 01] ] Algorithm: [MD5withRSA] 

这在新的Java 8版本中不会发生。

  1. 这部分:

TLSv1与TLSv1.2?

 http-nio-9080-exec-6, READ: TLSv1 Alert, length = 2 http-nio-9080-exec-6, RECV TLSv1.2 ALERT: fatal, handshake_failure 

它是说我正在尝试连接TLSv1.2吗? 还是TLSv1? 它不被接受? 我真的不明白。 有没有办法找出服务器接受哪些TLS版本?

我试过在启动时添加标志:

 -Dhttps.protocols=TLSv1 -Ddeployment.security.TLSv1=true -Djavax.net.ssl.keyStore=C:\keystore\keystore.keystore -Djavax.net.ssl.keyStorePassword=password -Djavax.net.ssl.trustStore=C:\keystore\keystore.keystore -Djavax.net.ssl.trustStorePassword=password 

还以编程方式添加密钥库管理器:

 KeyStore ks = KeyStore.getInstance("JKS"); InputStream ksIs = new FileInputStream("c:/srs/keystore/keystore.keystore"); try { ks.load(ksIs, password.toCharArray()); } catch (CertificateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (ksIs != null) { try { ksIs.close(); } catch (IOException e) { e.printStackTrace(); } } } KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(ks, password.toCharArray()); 

然后使用以下内容初始化SSLContext:

 sc.init(kmf.getKeyManagers(), trustAllCerts, new SecureRandom()); 

但问题仍然存在。 帮忙,有人吗?

好吧,现在我们已经开始工作了。 我会在这里发布答案,万一有人可能需要它。

我已经尝试了很多东西,所以我不完全确定实际需要做什么,但这里有一些东西:

设置

  -Dhttps.protocols=SSLv3,TLSv1,SSLv2Hello 

导致证书出现在javax.net.debug日志中,但我们仍然得到SSLHandshakeException 。 看起来服务器可以接受的唯一密码是SSL_RSA_WITH_RC4_128_MD5 。 这不是我们的客户自动选择的(仍然不知道为什么)。 这导致了增加

 -Dhttps.cipherSuites=SSL_RSA_WITH_RC4_128_MD5 

并且还添加

 socket.setEnabledCipherSuites(new String[] {"SSL_RSA_WITH_RC4_128_MD5"}); 

在代码中。 显然,限制客户端可以使用的可用密码套件使其工作。

jre/lib/security/java.security文件也必须更新为:

  • jdk.tls.disabledAlgorithms删除SSLv3
  • SSL_RSA_WITH_RC4_128_MD5添加到jdk.tls.legacyAlgorithms

这可能不建议用于生产服务器,因为a)SSLv3已过时,并且b)密码非常陈旧且过时,但在这种情况下,安全性不是一个大问题(内部应用程序使用)。

这些post对我也有帮助:

  • Java 7的SSL连接失败
  • Java 7(充当客户端)使用在Java 6中工作的密钥库和信任库的SSL握手失败
  • 收到致命警报:handshake_failure通过SSLHandshakeException
  • Java密码套件

我的猜测是你的服务器太破碎了,无法正确处理TLS 1.2握手。 通常,不了解TLS 1.2的服务器应该以最好的版本回复,但服务器不能回复。

像这样的破碎服务器存在,浏览器尝试通过使用较低的TLS版本重试来解决这些问题。 在浏览器之外,这些重试并不常见,因此这些客户端只会失败。

虽然我不能肯定地说服务器已经损坏了15年前过期的证书并且使用了长期破解的MD5算法签名,这表明您必须处理一个非常古老且被忽视的安装。 因此,原始服务器的开发人员从未想过TLS 1.2之类的东西可能永远存在,或者它在TLS 1.2握手中使用的TLS扩展之一上崩溃。

由于此问题与证书的validation无关,因此通过摆弄validation区域来解决问题的所有尝试都是无用的。 如果您强制使用TLS 1.1或TLS 1.1而不是TLS 1.2,则可能会获得更多成功。 您可以尝试使用-Dhttps.protocols=TLSv1,TLSv1.1-Dhttps.protocols=TLSv1设置执行此操作。

 String testURL = "https://api.chargeio.com/status"; SSLContext sslcontext = SSLContext.getInstance("TLSv1.2"); sslcontext.init(null, null, null); try { SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslcontext, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); // Socket HttpClient client = HttpClients.custom().setSSLSocketFactory(socketFactory).build(); HttpGet httpget = new HttpGet(testURL); HttpResponse response = client.execute(httpget); System.out.println(EntityUtils.toString(response.getEntity())); System.out.println("Response Code (Apache): " + response.getStatusLine().getStatusCode()); } catch (Exception e) { System.err.println("HttpsURLConnection Failed"); e.printStackTrace(); }