Ошибка SSL в Android: сертификат не является доверенным - PullRequest
3 голосов
/ 30 сентября 2011

В приложении, над которым я работаю, я должен установить HTTPS-соединение с моим веб-сервером, который использует самозаверяющий сертификат.Я получал сертификат, которому не доверяли ошибки, и после консультации с SO, я нашел эту запись в блоге: http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/

Я создал хранилище ключей JKS для моего tomcat, работающего на моей локальной машине, с помощью Keytool с помощью следующей команды

 keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048

И я извлек сертификат из этого хранилища ключей JKS в кодированном DER-формате, используя инструмент с открытым исходным кодом portecle

И затем я создал новое хранилище ключей BKS с указанным выше сертификатом, используя тот жеВ инструменте portecle android встроена поддержка провайдера Bouncy Castle.

Теперь, если я сделаю http-пост, как показано в первом URL, я получу следующее исключение в logcat.

WARN/System.err(498): javax.net.ssl.SSLException: Not trusted server certificate
WARN/System.err(498):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:371)
WARN/System.err(498):     at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:92)
WARN/System.err(498):     at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381)
WARN/System.err(498):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:164)
WARN/System.err(498):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
WARN/System.err(498):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
WARN/System.err(498):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:348)
WARN/System.err(498):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
WARN/System.err(498):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
WARN/System.err(498):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
WARN/System.err(498):     at com.portal.activity.Registration$ProgressThread.run(Registration.java:324)
WARN/System.err(498): Caused by: java.security.cert.CertificateException: java.security.InvalidAlgorithmParameterException: the trust anchors set is empty
WARN/System.err(498):     at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:151)
WARN/System.err(498):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:366)
WARN/System.err(498):     ... 10 more
WARN/System.err(498): Caused by: java.security.InvalidAlgorithmParameterException: the trust anchors set is empty
WARN/System.err(498):     at java.security.cert.PKIXParameters.checkTrustAnchors(PKIXParameters.java:611)
WARN/System.err(498):     at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:86)
WARN/System.err(498):     at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.<init>(TrustManagerImpl.java:82)
WARN/System.err(498):     at org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl.engineGetTrustManagers(TrustManagerFactoryImpl.java:132)
WARN/System.err(498):     at javax.net.ssl.TrustManagerFactory.getTrustManagers(TrustManagerFactory.java:226)
WARN/System.err(498):     at org.apache.http.conn.ssl.SSLSocketFactory.createTrustManagers(SSLSocketFactory.java:263)
WARN/System.err(498):     at org.apache.http.conn.ssl.SSLSocketFactory.<init>(SSLSocketFactory.java:190)
WARN/System.err(498):     at org.apache.http.conn.ssl.SSLSocketFactory.<init>(SSLSocketFactory.java:216)
WARN/System.err(498):     at com.portal.httpclient.MyHttpClient.newSslSocketFactory(MyHttpClient.java:51)
WARN/System.err(498):     at com.portal.httpclient.MyHttpClient.createClientConnectionManager(MyHttpClient.java:31)
WARN/System.err(498):     at org.apache.http.impl.client.AbstractHttpClient.getConnectionManager(AbstractHttpClient.java:221)
WARN/System.err(498):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:539)
WARN/System.err(498):     ... 3 more

Мой HttpClient такой же, как и в первом URL-адресе, за исключением того, что порты для http и https изменены на 8080 и 8443 вместо 80 и 443. соответственно.

Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

Инструкции по использованию пользовательских трестов с Android вы можете найти здесь http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html

Кратко:

  • Получить публичный сертификат для сервера
  • Создать доверенное хранилище BKS с этим сертификатом
  • Создайте и используйте собственный HttpClient для своего поста

Звучит так, будто вы сделали первые два, но не нижний шаг.

Кроме того, использовал ли Portecle правильные флаги? Вам нужен флаг trustcacerts при создании магазина BKS, иначе он не будет работать.

0 голосов
/ 04 октября 2011

Я перестал использовать portecle и сделал все, используя командную строку

Я использую только keytool для выполнения всего, как показано в URL моего вопроса.

Это сработало для меня.

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