我正在处理处理食品订单的应用程序,我们通过HttpsURLConnection
将请求发送到已通过ssl认证的php函数。我遇到的问题是它有时拒绝握手,而不是其他人。我想知道是否有人可以向我解释为什么它会拒绝它一次而不是另一次。
javax.net.ssl.SSLProtocolException:SSL握手已中止: ssl = 0x56cbe008:SSL库失败,通常是协议错误 错误:14077410:SSL例程:SSL23_GET_SERVER_HELLO:sslv3警报握手失败(external / openssl / ssl / s23_clnt.c:744 0x52eb6d74:00000000) javax.net.ssl.SSLHandshakeException:javax.net.ssl.SSLProtocolException:SSL握手已中止: ssl = 0x56cbe008:SSL库失败,通常是协议错误 错误:14077410:SSL例程:SSL23_GET_SERVER_HELLO:sslv3警报握手失败(external / openssl / ssl / s23_clnt.c:744 0x52eb6d74:00000000)
url = new URL(request.endpointUri);
Log.d(LOG_TAG, "Opening connection to " + request.endpointUri);
conn = (HttpsURLConnection)url.openConnection();
//setup the connection
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("charset", "UTF-8");
conn.setDoInput(true);
conn.setDoOutput(true);
//setup the parameters
Uri.Builder params = new Uri.Builder();
String paramString;
params.appendQueryParameter("cctoken", request.token.getId());
params.appendQueryParameter("amt", Integer.toString(request.order.amount));
params.appendQueryParameter("email", request.order.customerEmail);
params.appendQueryParameter("order", request.order.details);
paramString = params.build().getEncodedQuery();
conn.setFixedLengthStreamingMode(paramString.getBytes("UTF-8").length);
Log.d(LOG_TAG, "Compiled query into: " + paramString);
//write the POST request params
OutputStream os = conn.getOutputStream();
BufferedWriter streamWriter = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
streamWriter.write(paramString);
streamWriter.flush();
streamWriter.close();
os.close();
//read the response
int responseCode = conn.getResponseCode();
InputStream is;
失败的原因是它试图收集输出。
OutputStream os = conn.getOutputStream();
答案 0 :(得分:4)
有时只发生SSL握手错误通常与服务器端问题有关,因此您的代码在这方面没有多大帮助。服务器端的可能原因是具有不同配置的多个服务器(一些工作,一些不工作),超时可能由负载过多,服务器端崩溃引起。可能还会涉及一些不稳定的中间件(防火墙),或者如果连接从一开始就不可靠,它也会影响SSL握手。
因此,不要过多看你的代码,而是看看服务器和网络。如果有疑问,请尝试另一个客户端,如果这个客户端显示更稳定的行为,请查看连接和SSL握手(即数据包捕获)的差异。
答案 1 :(得分:1)
此问题可能是由于您要向其发送请求的服务器的自签名证书。你必须做这样的事情: `//从InputStream加载CA. //(可以来自资源或ByteArrayInputStream或......)
CertificateFactory cf = CertificateFactory.getInstance("X.509");
// From https://www.washington.edu/itconnect/security/ca/load-der.crt
InputStream caInput = new BufferedInputStream(new FileInputStream("load- der.crt"));
Certificate ca;
try {
ca = cf.generateCertificate(caInput);
System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN());
} finally {
caInput.close();
}
//创建包含受信任CA的KeyStore
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
//创建一个信任我们的KeyStore中的CA的TrustManager
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);`
答案 2 :(得分:0)
相关问题:客户端和服务器不支持通用的加密协议
如果错误消息显示类似以下内容:
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。通过创建TLSSocketFactory和X509TrustManager并调用setSSLSocketFactory(),我可以使旧版本的Android使用TLS1.2,这使服务器感到满意。 Navneet Krishna在以下方法中对此进行了很好的描述:[https://medium.com/@krisnavneet/how-to-solve-sslhandshakeexception-in-android-ssl23-get-server-hello-tlsv1-alert-protocol -13b457c724ef]