2016-07-02 3 views
1

У меня есть клиентское приложение, предназначенное для Android. Приложения для Android основаны на XML и Java, так что наше приложение на стороне сервера для Windows. Проблема в том, что, поскольку мы сейчас работаем с Android, нам приходится иметь дело с магазином доверия. Есть ли способ добавить сертификат в хранилище доверия динамически?Как добавить сертификат в магазин доверия 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); 
} 
+0

Вы создаете свой 'KeyStore', тогда вы ничего не делаете с ним. Попробуйте обернуть его в «TrustManagerFactory», используя его для 'init()' '' SSLContext' и получите 'SSLSocketFactory' из' SSLContext'. – CommonsWare

+0

Можете ли вы подробно объяснить, как я это сделаю? Я не знаю, как работать с SSLContext. – Scottie9811

ответ

2

Попробуйте что-то вроде этого, учитывая ваши trustStore:

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 для этого код.

+0

Вау, вы на самом деле сделали свой код вокруг моего кода. Первый человек, которого я видел, учитывал это. Я буду голосовать, когда выясню, работает ли это. – Scottie9811

+0

Хорошо, код работает отлично. Но теперь у меня другая проблема. В чате рассылаются сообщения, содержащие ничего, и когда я отправляю сообщение, в чате не появляется ничего. (Отображается на стороне сервера, хотя). Я быстро отредактирую свой вопрос, чтобы показать вам, как я читаю на стороне клиента. – Scottie9811

+0

Не обращайте на это внимание, исправил его, установив произвольную длину 512 байт. Спасибо за вашу помощь! – Scottie9811

Смежные вопросы