java - javax.net. ssl.SSLHandshakeException: javax.net. ssl.SSLProtocolException: SSL握手中止

  显示原文与译文双语对照的内容
0 0

我一直在寻找这个问题的解决方案,但是我看不出来

我试图在 Android 应用 和服务器之间的http连接上使用 ssl,我已经创建了一个自签名证书的密钥库

我有以下代码:


 URL url;
 SSLContext sslContext = null;
 KeyStore keyStore = KeyStore.getInstance("BKS"); 
 InputStream input = SportsApplication.getContext().getResources().openRawResource(R.raw.mykeystore);
 keyStore.load(input,"mypass".toCharArray());
 KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
 kmf.init(keyStore,"mypass".toCharArray());
 KeyManager[] keyManagers = kmf.getKeyManagers();
 sslContext = SSLContext.getInstance("TLS");
 sslContext.init(keyManagers, null, null);

 HttpsURLConnection connection = null;
 String urlParameters = mJObject.toString();
 try {
 Log.w("client", mUrl);
 Log.v("client","request:"+urlParameters);
//Create connection
 mUrl = mUrl.replaceFirst("http","https");
 url = new URL(mUrl);
 connection = (HttpsURLConnection) url.openConnection();
 try{

 connection.setSSLSocketFactory(sslContext.getSocketFactory());
 }
 catch (Exception e1) {
 e1.printStackTrace();
 int tx =0;
 }
 try{
 connection.setRequestMethod("POST");
 connection.setRequestProperty("Content-type","application/json");
 connection.setRequestProperty("Accept","application/json");
 connection.setReadTimeout(dataTimeout);
 connection.setConnectTimeout(com.inmobly.buckeyes.client.Constants.DEFAULT_CONN_TIMEOUT);

 connection.setUseCaches(false);
 connection.setDoInput(true);
 connection.setDoOutput(true);
 }
 catch (Exception e1) {
 e1.printStackTrace();
 int tx =0;
 }
//Send request
 DataOutputStream wr = null;
 try{
 wr = new DataOutputStream(connection.getOutputStream());
 }
 catch (Exception e1) {
 e1.printStackTrace();
 int tx =0;
 }

但我一直有这个例外:


javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x1b1b0e0: Failure in SSL library, usually a protocol errorerror:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:683 0x4029bcf5:0x00000000)

我做错什么了?

时间: 原作者:

0 0

由于SSL握手本身没有通过,而不是使用异常中的信息调试它,可以在系统( 它在模拟器上也可以重现) 上查看数据包捕获。 如果错误是由于服务器和客户端上ssl实现的协议版本不匹配,包应该具有必要的信息。 你可以先尝试一个简单的ssl握手,以确保握手正确地与服务器发生了握手。 让我们知道你得到的信息,我们将进一步调试 !

0 0

关于如何在安卓中禁用 HttpsUrlConnection,请参考我在上的答案。

...