Я разрабатываю мобильное приложение AIR (Flex) для Android и ему нужно общаться с http-сервером с использованием SSL или TSL. Я получил цепочку сертификатов CA с помощью Firefox (проверил также с другими инструментами) и получил следующую цепочку:Android-хранилище Android игнорируется моим мобильным приложением AIR
Тот почесал моя компанию SSL/TSL сервер. По соображениям безопасности я предпочитаю не публиковать свой адрес. Итак, выяснив, какие сертификаты мне нужны (всего две в цепочке), я обыскал на своем Android-планшете, какие сертификаты там установлены. Как вы можете видеть на следующей картинке, корневой сертификат, «VeriSign Class 3 Public Primary сертификации - G5» уже установлены в системе:
Единственное, что мне нужно, чтобы загрузить был « VeriSign Class 3 Secure CA Server - G3” , который я уже сделал:
Теперь я пытаюсь войти на сервер HTTP с двумя различными браузерами, и я больше не обязан принимать какие-либо сертификаты. Проблема возникает, когда AIR входит в сцену. Я пробовал два подхода к общению с сервером, используя HTTPService и SecureSocket. Для первого я использую следующий код:
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
title="HomeView">
<fx:Declarations>
<s:HTTPService id="bookingservice"
resultFormat="text"
url="https://www.myserver.com/"
result="bookingservice_resultHandler(event)"
fault="bookingservice_faultHandler(event)"/>
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
protected function button1_clickHandler(event:MouseEvent):void
{
resultado.text = "llamando...";
bookingservice.send();
}
protected function bookingservice_resultHandler(event:ResultEvent):void
{
resultado.text = event.result as String;
}
protected function bookingservice_faultHandler(event:FaultEvent):void
{
resultado.text = "satus code: " + event.statusCode + " mensaje: " + event.message.toString();
}
]]>
</fx:Script>
<s:Button top="10" right="10" click="button1_clickHandler(event)" label="Extra" />
<s:TextArea id="resultado"
width="80%" height="80%"
horizontalCenter="0" verticalCenter="0" />
</s:View>
Этот невероятно простой подход заканчивается окном сообщения с просьбой пользователя принять непроверенный сервер, даже если все его цепь сертификаты установлены на хранилище сертификатов системы Android. Для второго подхода я использую следующий код:
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
title="HomeView">
<fx:Script>
<![CDATA[
private var secureSocket:SecureSocket = new SecureSocket;
protected function button1_clickHandler(event:MouseEvent):void
{
secureSocket.addEventListener(Event.CONNECT, onConnect)
secureSocket.addEventListener(IOErrorEvent.IO_ERROR, onError);
resultado.text = "llamando...";
try
{
secureSocket.connect("https://www.myserver.com/",443);
}
catch (error:Error)
{
trace (error.toString());
}
resultado.text = "llamando...";
}
private function onConnect(event:Event):void
{
resultado.text = "Connected.";
}
private function onError(error:IOErrorEvent):void
{
resultado.text = error.text + ", Server Certificate Status: " + secureSocket.serverCertificateStatus;
}
]]>
</fx:Script>
<s:Button top="10" right="10" click="button1_clickHandler(event)" label="Extra" />
<s:TextArea id="resultado"
width="80%" height="80%"
horizontalCenter="0" verticalCenter="0" />
</s:View>
Для этого последнего подхода, я даже не получаю окно с запросом авторизации сертификата, я только получаю ошибку, которая говорит: «Error # 2031: Ошибка сокета. URL: https://www.myserver.com/, Статус сертификата сервера: недействителен ". Я хотел бы знать, почему среда выполнения AIR (Flex) не рассматривает сертификаты, которые уже установлены в хранилище сертификатов Android, и по-прежнему запрашивает авторизацию пользователя или, что еще хуже, дает ошибки и заявляет, что сертификат сервера недействителен. Кто-нибудь знает, почему это происходит? Я что-то упускаю?
Каждая помощь будет оценена по достоинству.
Вместо 'www.myserver.com' вы также попробовали' myserver.com'? –
@AlexanderFarber, 'www.myserver.com' - всего лишь пример, на самом деле, домен является' something.myserver.com'. – SebastianT