Java 如何将证书添加到Android信任存储?

Java 如何将证书添加到Android信任存储?,java,android,ssl,Java,Android,Ssl,我有一个为Android设计的客户端应用程序。Android应用程序基于XML和Java,我们的Windows服务器端应用程序也是如此。问题是,由于我们现在正在使用Android,我们必须处理信任商店。是否有任何方法可以动态地将证书添加到信任存储中 客户端连接代码: InputStream stream = main.getResources().openRawResource(R.raw.keystore); KeyStore trustStore; try { trustStore =

我有一个为Android设计的客户端应用程序。Android应用程序基于XML和Java,我们的Windows服务器端应用程序也是如此。问题是,由于我们现在正在使用Android,我们必须处理信任商店。是否有任何方法可以动态地将证书添加到信任存储中

客户端连接代码:

InputStream stream = main.getResources().openRawResource(R.raw.keystore);
KeyStore trustStore;
try {
  trustStore = KeyStore.getInstance("BKS");
  trustStore.load(stream, "password".toCharArray());
} catch (Exception e) {
  e.printStackTrace();
}
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
try{
  clientSocket = (SSLSocket) factory.createSocket(address, port);
}catch (Exception ex){
  ex.printStackTrace();
}
System.setProperty("javax.net.ssl.keyStore", System.getProperty("java.io.tmpdir") + "keystore_30290.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "password");
SSLServerSocketFactory factory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
try {
    server = ((SSLServerSocket)factory.createServerSocket(config.port));
} catch (Exception e) {
    e.printStackTrace();
    System.out.println("Failed to successfully bind to port "+config.port+".");
    System.exit(-1);
}
服务器端连接代码:

InputStream stream = main.getResources().openRawResource(R.raw.keystore);
KeyStore trustStore;
try {
  trustStore = KeyStore.getInstance("BKS");
  trustStore.load(stream, "password".toCharArray());
} catch (Exception e) {
  e.printStackTrace();
}
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
try{
  clientSocket = (SSLSocket) factory.createSocket(address, port);
}catch (Exception ex){
  ex.printStackTrace();
}
System.setProperty("javax.net.ssl.keyStore", System.getProperty("java.io.tmpdir") + "keystore_30290.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "password");
SSLServerSocketFactory factory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
try {
    server = ((SSLServerSocket)factory.createServerSocket(config.port));
} catch (Exception e) {
    e.printStackTrace();
    System.out.println("Failed to successfully bind to port "+config.port+".");
    System.exit(-1);
}

考虑到您的
信任库
,请尝试以下操作:

KeyManagerFactory kmfactory = KeyManagerFactory.getInstance(
                              KeyManagerFactory.getDefaultAlgorithm());
kmfactory.init(trustStore, "password".toCharArray());
KeyManager[] keymanagers =  kmfactory.getKeyManagers();

TrustManagerFactory tmf=TrustManagerFactory
  .getInstance(TrustManagerFactory.getDefaultAlgorithm());

tmf.init(trustStore);

SSLContext sslContext=SSLContext.getInstance("TLSv1.2");

sslContext.init(keymanagers, tmf.getTrustManagers(), new SecureRandom());

SSLSocketFactory factory=sslContext.getSocketFactory();

此代码的最小API为16。

创建
密钥库
,然后不使用它执行任何操作。尝试将它包装在一个
TrustManagerFactory
中,使用它来
init()
一个
SSLContext
,并从
SSLContext
中获取您的
SSLSocketFactory
。您能在回答中详细说明我将如何做到这一点吗?我不知道如何使用SSLContext。哇,你实际上是围绕我的代码编写代码的。我见过的第一个考虑到这一点的人。一旦我弄清楚这是否有效,我会投票的。好的,代码运行得很好。但现在我有另一个问题。聊天时会发送不包含任何内容的垃圾邮件,当我发送消息时,聊天中不会显示任何内容。(但确实会显示在服务器端)。我将快速编辑我的问题,向您展示我如何在客户端阅读。没关系,通过设置512字节的自定义长度来修复它。谢谢你的帮助@斯考蒂9811:很高兴你明白了。我不经常使用低级套接字。我向您展示的代码来自一些代码,这些代码使用
SSLContext
来配置HTTP客户端以使用该密钥库。它还导致了速度有多慢的问题,就好像在第一个数据包没有被发送后,你发送的数据包太快了。android用户有没有更快的版本?