2015-10-29 8 views
0

Я пытаюсь установить соединение через мой клиент Android на свой сервер. Сервер HTTPS. Чтобы клиент подключился к серверу, я использовал client.key и client.crt, который был подписан через тот же файл CA.crt, что и сервер, и преобразован в формат .p12. Предполагается, что клиент должен иметь закрытый ключ и открытый ключ. Но клиент не должен иметь закрытый ключ сервера. Единственный способ заставить Android работать - загрузить в файл p12 с сервера в TrustManagerFactory. Но это не так, поскольку закрытый ключ с сервера находится внутри этого файла. TrustManagerFactory не позволяет загружать файлы в формате .crt.Использование .crt вместо .p12

Мой вопрос: Как загрузить файл .crt в KeyStore вместо p12, который я использую сейчас. Или мне нужно использовать что-то еще, а затем KeyStore.

+0

Pls прочитать следующее, чтобы увидеть, если он может помочь вам или нет http://stackoverflow.com/questions/32969952/android-to-server-communication-using-ssl-with- bouncy-castle/32980130 # 32980130 – BNK

+0

@BNK Ваш ответ ему не поможет, потому что он не хотел загружать файл '.p12' (из-за включенного в него закрытого ключа сервера), он хотел использовать чистый' .crt' , И нет никакой информации о том, как создать «Keystore» с сертификатом только для того, чтобы он мог отправить этот «Keystore». – Than

+0

@ В моей ссылке есть два варианта: для файла хранилища ключей и для файла сертификата. – BNK

ответ

1

Directly from google dev guide working solution for ya:

// Load CAs from an InputStream 
// (could be from a resource or ByteArrayInputStream or ...) 
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(); 
} 

// Create a KeyStore containing our trusted CAs 
String keyStoreType = KeyStore.getDefaultType(); 
KeyStore keyStore = KeyStore.getInstance(keyStoreType); 
keyStore.load(null, null); 
keyStore.setCertificateEntry("ca", ca); 

// Create a TrustManager that trusts the CAs in our KeyStore 
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); 
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); 
tmf.init(keyStore); 

// Create an SSLContext that uses our TrustManager 
SSLContext context = SSLContext.getInstance("TLS"); 
context.init(null, tmf.getTrustManagers(), null); 

// Tell the URLConnection to use a SocketFactory from our SSLContext 
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); 
+0

Спасибо, это именно то, что я искал. – Rockernaap

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