2015-01-16 2 views
1

Поскольку мне было поручено задавать этот вопрос в моем собственном вопросе, я делаю это здесь.
Чтобы посмотреть Original Topic, в котором я сначала задал свой вопрос (удалил сейчас).Volley Request over https работает только с Wi-Fi (wlan), но не для 3G/GPRS (umts)

Я застрял с той же проблемой, и, к сожалению, ответы автора не помогают.

Чтобы представить мою проблему немного подробнее, я работаю с самоподписанным сертификатом на моем сервере Tomcat 8 (v8.0.15) в Интернете с Java 8 (v8.0.25 - JDK). Там я размещаю приложение Java EE, которое является бэкэнд для моего приложения для Android. Соединитель SSL Tomcat работает так, как должен. Когда я тестирую бэкэнд с RESTClient, я получаю результат, как ожидалось.
Я создал хранилище ключей с одним сертификатом:

keytool -genkey -alias tomcat -keystore tomcat.keystore 
-storepass MYKEYSTOREPASS -keyalg RSA -keysize 2048 -validity 365 

Затем я извлек сертификат:

keytool -export -alias tomcat -storepass MYKEYSTOREPASS 
-keystore tomcat.keystore -file tomcat.cer 

Наконец я создал новое хранилище ключей в формате BKS для моего Android Применение:

keytool -import -alias tomcat -file tomcat.cer -keypass MYKEYSTOREPASS 
-keystore tomcat.bks -storetype BKS -storepass MYKEYSTOREPASS 
-providerClass org.bouncycastle.jce.provider.BouncyCastleProvider 
-providerpath $PATH_TO_BC_LIBRARY/bcprov-jdk16-146.jar 

(упомянуто here "-экспорт" »и« -импорт »являются предыдущими выпусками, но все еще пригодными для использования. Таким образом, вы могли бы также знать эту команду параметры, как «-exportcert» и «-importcert»)

После завершения этого шага я пытался соединить и все пошло нормально. Но только до тех пор, пока я не отключил/не отключил WLAN-соединение. Тогда он больше не работает и приносит «javax.net.ssl.SSLPeerUnverifiedException: no peer certificate».
Я действительно не понимаю этого поведения.

Чтобы скрасить сторону андроида немного больше:
Я использовал классы/библиотеки от this tutorial точно так же.

Если что-то не хватает, просто комментарий, и я приведу информацию.

Большое спасибо!

+0

Вы используете локальный сервер tomcat? –

+0

Hi Suhail Mehta, я отредактировал мой вопрос. –

+0

Что вы подразумеваете под «расположенным в www», означает ли это, что на каком-то сервере, который является внешним по отношению к вашей Wi-Fi сети? – Ognyan

ответ

1

Делая мое исследование на сервере Fault для подобных вопросов, которые я получил намек, что может быть неправильно также: https://serverfault.com/questions/560733/why-isnt-tomcat-serving-the-correct-ssl-certificate Я попробовал его с отсутствующим параметром «keyAlias», и это сработало! Решение было окончательно - как ожидалось ранее Ogre_BGR - не оптимальная конфигурация tomcat. Разъем выглядит следующим образом:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
      maxThreads="150" scheme="https" secure="true" 
      clientAuth="false" sslProtocol="TLS" 
      keystoreFile="PATH_TO_YOUR_KEYSTORE" 
      keystorePass="PASSWORD_FOR_YOUR_KEYSTORE" 
      keyAlias="ALIAS_OF_YOUR_CERTIFICATE" 
      maxHttpHeaderSize="8192" 
      /> 

Tomcat молча выбирает только первый ключ, который находит в хранилище, когда нет keyAlias ​​не настроен. Упомянуто в документах here (внизу).

Надеюсь, что когда-нибудь кто-то будет рад прочесть это, имея ту же проблему.

Еще раз спасибо @Ogre_BGR :)

0

Я думаю, что это просто проблема конфигурации сервера. Я не уверен, как работает Tomcat, но, вероятно, он похож на Apache, где вы объявляете один виртуальный хост для «обычных» запросов (т. Е. Не https) и одного виртуального хоста для HTTPS (который включает сертификат SSL). Обычно каждый виртуальный хост привязан к одному IP-адресу. Вполне возможно, что при доступе к вашему серверу через WIFI вы получаете некоторый «внутренний» IP-адрес, такой как 192.168. * И, вероятно, вы настроили свой виртуальный хост для привязки к этому ip.

Когда вы получаете доступ через 3G, вы проезжаете через «общедоступную» сеть, а затем IP-адрес сервера отличается, поэтому виртуальный хост не соответствует, например. SSL-сертификат не используется, и вы получаете «No peer certificate».

Я предлагаю вам проверить конфигурацию и журналы сервера и посмотреть, как к серверу обращается любой из этих методов.

+0

Я подключаюсь через абсолютные URL-адреса к моему серверу. Что-то вроде этого: 'HTTPS: //aaa.bbb.ccc.ddd: 8443/APP/rest/bla/foo' Коннектор привязан к этому порту (8443), поэтому SSL используется каждый раз. Просто для примера: Выполняю вызов с компьютера в полностью чужой сети с тем же URL-адресом ('HTTPS: //aaa.bbb.ccc.ddd: 8443/APP/rest/bla/foo') как в приложении Android, и я получаю свой результат. Но с APP на моем смартфоне он не работает через 3G. Я получил то, что вы ответили, но я не уверен, что это будет иметь смысл. Потому что мой пример примерно такой же и обеспечивает контрпример. –

+0

Просто уточнить: вы используете самоподписанный сертификат с «общим именем» (FQDN) вашего IP-адреса или какого-либо домена/поддомена? – Ognyan

+0

Да, я использую сам подписанный сертификат с ip моего имени сервера, другие метаинформации пустые. –

Смежные вопросы