Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android上不一致的SSLv3握手失败_Java_Android_Ssl_Https - Fatal编程技术网

Java Android上不一致的SSLv3握手失败

Java Android上不一致的SSLv3握手失败,java,android,ssl,https,Java,Android,Ssl,Https,我正在开发一个处理食品订单的应用程序,我们通过HttpsURLConnection将请求发送到一个经过ssl认证的php函数。我遇到的问题是,它有时拒绝握手,而不是其他握手。我想知道是否有人能向我解释为什么它会一次而不是另一次拒绝它 javax.net.ssl.SSLProtocolException:ssl握手中止: ssl=0x56cbe008:ssl库中出现故障,通常是协议错误 错误:14077410:SSL例程:SSL23\u GET\u SERVER\u HELLO:sslv3警报握手

我正在开发一个处理食品订单的应用程序,我们通过
HttpsURLConnection
将请求发送到一个经过ssl认证的php函数。我遇到的问题是,它有时拒绝握手,而不是其他握手。我想知道是否有人能向我解释为什么它会一次而不是另一次拒绝它

javax.net.ssl.SSLProtocolException:ssl握手中止: ssl=0x56cbe008:ssl库中出现故障,通常是协议错误 错误:14077410:SSL例程:SSL23\u GET\u SERVER\u HELLO:sslv3警报握手失败(外部/openssl/SSL/s23\u clnt.c:744 0x52eb6d74:0x00000000) javax.net.ssl.sslhandshake异常:javax.net.ssl.SSLProtocolException:ssl握手中止: ssl=0x56cbe008:ssl库中出现故障,通常是协议错误 错误:14077410:SSL例程:SSL23\u GET\u SERVER\u HELLO:sslv3警报握手失败(外部/openssl/SSL/s23\u clnt.c:744 0x52eb6d74:0x00000000)

为failure指定的行是当它尝试收集输出时

OutputStream os = conn.getOutputStream();

SSL握手错误通常与服务器端问题有关,因此您的代码在这里没有多大帮助。服务器端的可能原因是多台服务器具有不同的配置(有些工作,有些不工作),可能是由于负载过大而导致的超时,服务器端崩溃。还可能涉及一些不稳定的中间件(防火墙),或者如果连接从一开始就不可靠,那么它也会影响SSL握手


因此,不要过多地查看代码,而是查看服务器和网络。如果有疑问,请尝试另一个客户端,如果该客户端表现出更稳定的行为,请查看连接和SSL握手(即数据包捕获)的差异

此问题可能是由于要向其发送请求的服务器的自签名证书造成的。你必须这样做: `//从InputStream加载CA //(可能来自资源或ByteArrayInputStream或…)

//创建包含可信CA的密钥库

String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
//创建信任密钥库中CA的信任管理器

String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
//创建使用TrustManager的SSLContext

SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);
//告诉URLConnection使用SSLContext中的SocketFactory

URL url = new URL("https://certs.cac.washington.edu/CAtest/");
HttpsURLConnection urlConnection =
(HttpsURLConnection)url.openConnection();
urlConnection.setSSLSocketFactory(context.getSocketFactory());
InputStream in = urlConnection.getInputStream();
copyInputStreamToOutputStream(in, System.out);`

相关问题:客户端和服务器不支持通用加密协议

如果错误消息显示如下内容:

error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version (external/openssl/ssl/s23_clnt.c:741 0x8d92d990:0x00000000)
(请注意,在“GET_SERVER_HELLO:”之后写的是'tlsv1,而不是'sslv3')这是一个模糊的线索,表明问题可能与所需的加密版本有关。如果客户端是旧的,它可能只支持sslv2或sslv3。最新的服务器可能支持TLS1.2,但不支持较旧的(可能是未授权的)ssl版本。相反的情况可能也是如此,服务器只支持旧版本,客户端只支持新版本

我在一个旧的Android Jelly Bean客户端上遇到了这个问题,默认情况下,该客户端不支持HttpsUrlConnection的TLS1.2我可以让旧版本的Android使用TLS1.2,这让服务器很开心。Navneet Krishna在下面的文章中很好地描述了如何做到这一点:

URL url = new URL("https://certs.cac.washington.edu/CAtest/");
HttpsURLConnection urlConnection =
(HttpsURLConnection)url.openConnection();
urlConnection.setSSLSocketFactory(context.getSocketFactory());
InputStream in = urlConnection.getInputStream();
copyInputStreamToOutputStream(in, System.out);`
error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version (external/openssl/ssl/s23_clnt.c:741 0x8d92d990:0x00000000)