#android #ssl #https #webdav #sardine
#Android #ssl #https #webdav #сардина
Вопрос:
я пытаюсь sardine создать клиент webdav, но он не подключается к моему https-серверу. в руководстве по использованию об этом говорится о ssl http://code.google.com/p/sardine/wiki/UsageGuide#SSL но я не знаю, как предоставить моему пользовательскому Http-клиенту мое хранилище ключей.
я получаю эту ошибку.
Исключение в потоке "main" javax.net.ssl.SSLPeerUnverifiedException: одноранговый узел не прошел проверку подлинности в com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates (неизвестный источник) в org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128) в org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:397) в org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148) в org.apache.http.impl.conn.AbstractPoolEntry.open (AbstractPoolEntry.java:149) в org.apache.http.impl.conn.AbstractPooledConnAdapter.open (AbstractPooledConnAdapter.java:121) в org.apache.http.impl.client.DefaultRequestDirector.TryConnect(DefaultRequestDirector.java:573) в org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425) в org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) в org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:941) в org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:919) в com.googlecode.sardine.impl.SardineImpl.execute(SardineImpl.java:684) в com.googlecode.sardine.impl.SardineImpl.list(SardineImpl.java:339) в com.googlecode.sardine.impl.SardineImpl.getResources(SardineImpl.java:326) в sardine.main(sardine.java:15)
Как я могу настроить?
Комментарии:
1. Мне также не повезло с реализацией Sardine для Android через SSL. Я тоже получаю «ошибку однорангового сертификата». У меня есть хранилище ключей в формате BouncyCastle (BKS), которое теперь необходимо вместо JKS, которые я прочитал. Он сохраняется в каталоге res/raw/. Кажется, я не могу понять, где переопределить HTTP-КЛИЕНТ, который был упомянут. Похоже, что библиотека использует АБСТРАКТНЫЙ HTTP-КЛИЕНТ. Где можно было бы переопределить HTTP-КЛИЕНТ? Есть еще какие-нибудь примеры? Редактировать: для чего это стоит. Я заметил, что тестирование с помощью эмулятора никогда не работало, но когда я делал это на реальных устройствах, я был в восторге.
Ответ №1:
Довольно простой пример (для http://mydrive.net и Linux):
- скачать сертификат с mydrive.net с помощью OpenSSL
- openssl s_client -подключение webdav.mydrive.ch:443 > mydrive.net.crt
- удалите все данные, кроме между НАЧАЛОМ и КОНЦОМ (включительно) в файле mydrive.net.crt
- создайте новое хранилище ключей:
- keytool -genkey -фиктивный псевдоним -keyalg RSA -хранилище ключей /etc/ssl/certs/java/yourKeyStore.jks -размер ключа 2048
- используйте безопасную парольную фразу
- Удалить неиспользуемый сгенерированный сертификат
- keytool -удалить -фиктивный псевдоним -хранилище ключей /etc/ssl/certs/java/yourKeyStore.jks
- Импортировать сертификат из mydrive.net
- keytool -импорт -trustcacerts -псевдоним mydrive.net -хранилище ключей /etc/ssl/сертификаты/java/kyourKeyStore.jks -file ./mydrive.net.crt
- Проверка импорта:
- keytool -list -хранилище ключей /etc/ssl/сертификаты/java/yourKeyStore.jks
- добавить параметр Java для хранилища ключей
- JAVA_OPTS=»$JAVA_OPTS -Djavax.net.ssl.trustStore=/etc/ssl/certs/java/yourKeyStore.jks»
- Перезапустите JVM
Теперь вы можете использовать Sardine без методов перезаписи или переопределения. Просто используйте
Sardine sardine = SardineFactory.begin(username, password);
List<DavResource> resources = sardine.list("https://webdav.mydrive.ch/");
Совет:
Убедитесь, что вы используете правильный сертификат. Например, у MyDrive есть несколько сертификатов
Ответ №2:
Храните хранилища ключей как необработанные ресурсы, загружайте их и используйте для инициализации SSLSocketFactory. Вы можете использовать его для создания экземпляра HttpClient
. Чтобы подключиться к Sardine, вам необходимо переопределить метод, который они указывают в Wiki, чтобы вернуть ваш настроенный HttpClient
экземпляр.
Комментарии:
1. Прочитайте SSLSocketFactory, на который я ссылался выше, в нем есть информация о создании и использовании хранилищ ключей.
2. Решаемая с помощью этого: javaskeleton. blogspot.com/2010/07 /…
3. Это плохо, плохо, плохо. Я бы хотел, чтобы люди перестали писать о том, чего они не понимают. Этот код будет принимать любые и все сертификаты и фактически аннулирует SSL. Возможно, вы отправляете свои данные на вредоносный сервер и никогда об этом не узнаете. Создайте свое собственное хранилище доверия и установите его правильно.