SSL на Android (через BouncyCastle) - PullRequest
1 голос
/ 24 июня 2011

http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/

Я следовал этому уроку, и все, казалось, было хорошо (я не получил никаких ошибок в дороге), но снова я получаю

06-24 18:42:31.746: WARN/System.err(14807): javax.net.ssl.SSLException: Not trusted server certificate
06-24 18:42:31.756: WARN/System.err(14807): Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: TrustAnchor for CertPath not found.
06-24 18:42:31.766: WARN/System.err(14807): Caused by: java.security.cert.CertPathValidatorException: TrustAnchor for CertPath not found.

У меня есть SSL на http://subdomain.domain.com - RapidSSL . Я скачал (один) сертификат и вставил его в хранилище ключей . Добавлен myHttpClient , но, опять же, я не могу заставить https работать.

Есть предложения?

РЕДАКТИРОВАТЬ: На рабочем столе все в порядке - я не получаю никаких ошибок / предупреждений вообще.

Ответы [ 3 ]

5 голосов
/ 05 апреля 2012

Подробные пошаговые инструкции, которым я следовал, чтобы добиться этого

  • Загрузите JAR-файл bouncycastle из 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 \ security
        • D: \ tools\ jre1.5.0_09 \ lib \ security
        • и добавьте следующую запись
          • security.provider.7 = org.bouncycastle.jce.provider.BouncyCastleProvider
      • Добавьте следующую переменную среды в раздел «Пользовательские переменные»
        • CLASSPATH =% CLASSPATH%; c: \ bcprov-ext-jdk15on-1.46.jar
    • Добавьте bcprov-ext-jdk15on-1.46.jar в CLASSPATH вашего проекта и добавьте следующую строку в свой код
      • Security.addProvider (новый BouncyCastleProvider ());
  • Создание хранилища ключейиспользование 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 и добавьте следующую запись

    • Перезагрузите сервер после этих изменений.

  • Настройка BouncyCastle для клиента Android
    • Нет необходимостидля настройки, поскольку Android внутренне поддерживает Bouncy Castle версии 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);
        }
    }
}

Как вызвать вышеуказанный код в вашемКласс деятельности:

DefaultHttpClient client = new MyHttpClient(getApplicationContext());
HttpResponse response = client.execute(...);
5 голосов
/ 24 июня 2011

Попробуйте http://www.digicert.com/help/, например - вставьте URL вашего сайта, и вы увидите, правильно ли установлен сертификат.Обычно для правильной установки сертификата вам нужно не только установить сертификат, но и промежуточный сертификат из вашего центра сертификации.Они обычно подписывают ваши сертификаты не своим основным сертификатом, а используют некоторые промежуточные сертификаты, которые они могут аннулировать в случае возникновения каких-либо проблем и которые не так «драгоценны», как основной - это означает, что ваш сертификат занимает третье место в цепочке:

сертификат основного органа -> сертификат промежуточного органа -> ваш собственный сертификат

Таким образом, вы должны сообщить своему клиенту не только свой сертификат, но и промежуточный.Инструкции по установке обычно доступны в вашей учетной записи органа по сертификации.

2 голосов
/ 28 октября 2015

Найдите и загрузите Файлы политики неограниченной юрисдикции Java Cryptography Extension (JCE) in http://www.oracle.com/technetwork/java/javase/downloads/index.html

Перезаписывают local_policy.jar и US_export_policy.jar в вашем JDK

jdk1.7.0_79 \ jre \ lib \ security \

и в вашем JRE

папка jre7 \ lib \ security \

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...