java - Android 到 JAVA SSL

标签 java android ssl

我是 Android 的相对新手,在获取与 Java 服务器工作的简单 SSL 连接时遇到了问题。

我知道 java 服务器工作正常,因为我使用与服务器相同的 keystore 和 java 客户端对其进行了测试。

当 java 服务器接受连接并显示 readline 变量的空值时,Android 客户端确实发送了一些内容,并且没有错误消息。

我有我的 keystore 和 bks 格式的信任库,并添加到 res/raw 文件夹中。

安卓客户端:

 SSLContext sslContext = SSLContext.getDefault();

    KeyStore trustSt = KeyStore.getInstance("BKS");
    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    InputStream trustStoreStream = this.getResources().openRawResource(R.raw.truststore);
    trustSt.load(trustStoreStream, "password".toCharArray());
    trustManagerFactory.init(trustSt);

    KeyStore keyStore = KeyStore.getInstance("BKS");
    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    InputStream keyStoreStream = this.getResources().openRawResource(R.raw.keystore);
    keyStore.load(keyStoreStream, "password".toCharArray());
    keyManagerFactory.init(keyStore, "password".toCharArray());

    sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
    }
    catch (NoSuchAlgorithmException nsae){Log.d("SSL", nsae.getMessage());}
    catch (KeyStoreException kse){Log.d("SSL", kse.getMessage());}
    catch (IOException ioe){Log.d("SSL", ioe.getMessage());}
    catch (CertificateException ce){Log.d("SSL", ce.getMessage());}
    catch (KeyManagementException kme){Log.d("SSL", kme.getMessage());}
    catch(AccessControlException ace){Log.d("SSL", ace.getMessage());}
    catch(UnrecoverableKeyException uke){Log.d("SSL", uke.getMessage());}

    try{
         //error catch
         String error = "test";

         sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
         s = (SSLSocket) sslsocketfactory.createSocket("192.168.2.101", port);

            outStream = s.getOutputStream();
            outStreamWriter = new OutputStreamWriter(outStream);
            bufferedWriter = new BufferedWriter(outStreamWriter);

            bufferedWriter.write(error + "\n");
            bufferedWriter.flush();          

              } //end try
              catch (UnknownHostException e) {e.printStackTrace();} 
              catch (IOException e) {e.printStackTrace();}

              finally{
                     if (s != null){
                     try {s.close();} 
                     catch (IOException e) {e.printStackTrace();}
                     }
                     }//end finally 
 }  

我已经指定了一个信任库,但不知道如何在套接字上初始化信任库。

如有任何帮助,我们将不胜感激。

最佳答案

我想改变这条线

sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();

使用SSLSocketFactory(KeyStore truststore) constructor可能会解决您的问题。

sslsocketfactory = new SSLSocketFactory(trustSt);

关于java - Android 到 JAVA SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15952814/

相关文章:

java - Maven 项目打包是 war ,也是构建/安装 jar

android - 如何在 onPreExecute 停止异步任务?

java - Android OpenCV List<KeyPoint> 到 Mat

ruby-on-rails - 带有 CA 证书的 Mongo SSL 配置仅适用于 Rails 控制台,不适用于 Rails 服务器

java - 重命名包 : "Cannot create file ' com'. 时出错文件已存在。”

java - 无法在 Play Frame 工作应用程序中导入 com.google.firebase.FirebaseApplication

java - 如何在 java 中使用 .pem 文件证书发布数据

ssl - Fiddler:我可以将来自外部控制台应用程序的传出流量重定向到 Fiddler 实例 (localhost:8888) 吗?

java - 集群中的spring boot应用程序

android - 从 Android 应用程序在 Facebook 上发布高分