Ответ 1
Подробные инструкции Step by Step, которые я выполнил, чтобы достичь этого
- Загрузите баунцикаст JAR из http://repo2.maven.org/maven2/org/bouncycastle/bcprov-ext-jdk15on/1.46/bcprov-ext-jdk15on-1.46.jar или взять его из папки "doc".
- Настройте BouncyCastle для ПК, используя один из приведенных ниже способов.
- Добавление поставщика BC статически (рекомендуется)
- Скопируйте файл bcprov-ext-jdk15on-1.46.jar в каждый
- D:\tools\jdk1.5.0_09\jre\lib\ext (JDK (в комплекте JRE)
- D:\tools\jre1.5.0_09\lib\ext (JRE)
- C:\(местоположение, которое будет использоваться в переменной env)
- Измените файл java.security в разделе
- D:\Tools\jdk1.5.0_09\JRE\Lib\безопасность
- D:\Tools\jre1.5.0_09\Lib\безопасность
- и добавьте следующую запись
- security.provider.7 = org.bouncycastle.jce.provider.BouncyCastleProvider
- Добавьте следующую переменную среды в раздел "Пользовательские переменные"
- CLASSPATH =% CLASSPATH%; C:\bcprov-доб-jdk15on-1.46.jar
- Скопируйте файл bcprov-ext-jdk15on-1.46.jar в каждый
- Добавьте bcprov-ext-jdk15on-1.46.jar в CLASSPATH вашего проекта и добавьте следующую строку в свой код
- Security.addProvider(новый BouncyCastleProvider());
- Добавление поставщика BC статически (рекомендуется)
- Создайте Keystore, используя Bouncy Castle
- Выполните следующую команду
- keytool -genkey -alias myproject -keystore C:/myproject.keystore -storepass myproject -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider
- Это создает файл C:\myproject.keystore
- Выполните следующую команду, чтобы проверить, правильно ли она создана или нет.
- keytool -list -keystore C:\myproject.keystore -storetype BKS
- Выполните следующую команду
-
Настроить BouncyCastle для TOMCAT
-
Откройте D:\tools\apache-tomcat-6.0.35\conf\server.xml и добавьте следующую запись
- < Разъем порт = "8443" keystorePass = "MyProject" псевдоним = "MyProject" Хранилище ключей = "C:/myproject.keystore" keystoreType = "БКС" SSLEnabled = "истина" clientAuth = "ложь" Протокол = "HTTP/1.1" Схема = "HTTPS" обеспечение = "истина" SSLProtocol = "TLS" sslImplementationName = "org.bouncycastle.jce.provider.BouncyCastleProvider" / >
-
Перезагрузите сервер после этих изменений.
-
- Настройка BouncyCastle для Android-клиента
- Не нужно настраивать, так как Android поддерживает Bouncy Castle Version 1.46 внутри предоставленного "android.jar".
- Просто реализуйте свою версию HTTP-клиента (MyHttpClient.java можно найти ниже) и установите следующее в коде
- SSLSocketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
- Если вы этого не сделаете, оно дает исключение, как показано ниже
- javax.net.ssl.SSLException: имя хоста в сертификате не соответствует: < 192.168.104.66 > !=
- В режиме производства измените приведенный выше код на
- SSLSocketFactory.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
MyHttpClient.java
package com.arisglobal.aglite.network;
import java.io.InputStream;
import java.security.KeyStore;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.SingleClientConnManager;
import com.arisglobal.aglite.activity.R;
import android.content.Context;
public class MyHttpClient extends DefaultHttpClient {
final Context context;
public MyHttpClient(Context context) {
this.context = context;
}
@Override
protected ClientConnectionManager createClientConnectionManager() {
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
// Register for port 443 our SSLSocketFactory with our keystore to the ConnectionManager
registry.register(new Scheme("https", newSslSocketFactory(), 443));
return new SingleClientConnManager(getParams(), registry);
}
private SSLSocketFactory newSslSocketFactory() {
try {
// Get an instance of the Bouncy Castle KeyStore format
KeyStore trusted = KeyStore.getInstance("BKS");
// Get the raw resource, which contains the keystore with your trusted certificates (root and any intermediate certs)
InputStream in = context.getResources().openRawResource(R.raw.aglite);
try {
// Initialize the keystore with the provided trusted certificates.
// Also provide the password of the keystore
trusted.load(in, "aglite".toCharArray());
} finally {
in.close();
}
// Pass the keystore to the SSLSocketFactory. The factory is responsible for the verification of the server certificate.
SSLSocketFactory sf = new SSLSocketFactory(trusted);
// Hostname verification from certificate
// http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e506
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
return sf;
} catch (Exception e) {
throw new AssertionError(e);
}
}
}
Как вызвать вышеуказанный код в классе Activity:
DefaultHttpClient client = new MyHttpClient(getApplicationContext());
HttpResponse response = client.execute(...);