#android #ssl
#Android #ssl
Вопрос:
Мне нужно написать приложение для Android, с которым будет осуществляться связь.Сетевой сервис. Я должен выполнить аутентификацию сервера / клиента. Я нашел несколько полезных разделов (этот блог и this blog) , но они оба показывают, как выполняется аутентификация сервера. Как я могу выполнить аутентификацию клиента? Я нашел полезное обсуждение, но там автор использует сокеты, но мне нужно сделать это через HttpClient.
Комментарии:
1. KeyManagerFactory.getInstance(«SunX509»); TrustManagerFactory tmf = TrustManagerFactory.getInstance(«X509»); tmf.init(ks);
Ответ №1:
следующее позволяет мне использовать мои собственные сертификаты rootca и клиент сервер. т.е. безопасность, не платя никому денег 🙂
создайте свой rootca, а также ключи и сертификаты клиента и сервера с помощью openssl (в Интернете есть множество руководств по этому)
создайте rootcacert.bks с помощью keytool с bouncycastle в качестве поставщика и -importcert
создайте clientcertandkey.p12 с помощью openssl pkcs12 -export …
HttpClient httpClient = null;
try {
HttpParams httpParameters = new BasicHttpParams();
KeyStore rootca = KeyStore.getInstance("BKS");
rootca.load(getResources().openRawResource(R.raw.rootcacert),"bkskeystorepass".toCharArray());
KeyStore mycert = KeyStore.getInstance("pkcs12");
mycert.load(getResources().openRawResource(R.raw.clientcertandkey),"pkcs12storepass".toCharArray());
SSLSocketFactory sockfact = new SSLSocketFactory(mycert,null,rootca);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("https",sockfact , 443));
httpClient = new DefaultHttpClient(new ThreadSafeClientConnManager(httpParameters, registry), httpParameters);
} catch (Exception e) {
e.printStackTrace();
}