2014-01-16 4 views
2

Я разрабатываю мобильное приложение AIR (Flex) для Android и ему нужно общаться с http-сервером с использованием SSL или TSL. Я получил цепочку сертификатов CA с помощью Firefox (проверил также с другими инструментами) и получил следующую цепочку:Android-хранилище Android игнорируется моим мобильным приложением AIR

enter image description here

Тот почесал моя компанию SSL/TSL сервер. По соображениям безопасности я предпочитаю не публиковать свой адрес. Итак, выяснив, какие сертификаты мне нужны (всего две в цепочке), я обыскал на своем Android-планшете, какие сертификаты там установлены. Как вы можете видеть на следующей картинке, корневой сертификат, «VeriSign Class 3 Public Primary сертификации - G5» уже установлены в системе:

enter image description here

Единственное, что мне нужно, чтобы загрузить был « VeriSign Class 3 Secure CA Server - G3” , который я уже сделал:

enter image description here

Теперь я пытаюсь войти на сервер 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, и по-прежнему запрашивает авторизацию пользователя или, что еще хуже, дает ошибки и заявляет, что сертификат сервера недействителен. Кто-нибудь знает, почему это происходит? Я что-то упускаю?

Каждая помощь будет оценена по достоинству.

+0

Вместо 'www.myserver.com' вы также попробовали' myserver.com'? –

+0

@AlexanderFarber, 'www.myserver.com' - всего лишь пример, на самом деле, домен является' something.myserver.com'. – SebastianT

ответ

0

Не реальный ответ, но для SecureSocket -

you can add your own certificates programmatically with the addBinaryChainBuildingCertificate() method

+0

документация [SecureSocket] (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/SecureSocket.html) не объясняет, как использовать 'addBinaryChainBuildingCertificate()'. Вы знаете, как использовать ir? – SebastianT

+0

Я загрузил каждый из трех сертификатов, преобразовал их в формат DER (Firefox экспортирует их как PEM) добавил все 3 из них в сокет, используя 'addBinaryChainBuildingCertificate()', даже я не получаю ошибок при использовании этого метода (как если бы вы сертификаты не в правильном формате) и по-прежнему та же ошибка: '' Ошибка # 2031: Ошибка сокета. URL: https://www.myserver.com/, Статус сертификата сервера: недействителен. У вас есть еще какие-то подсказки? – SebastianT

0

Просто измените

secureSocket.connect(" https://www.myserver.com/ ",443);

в

secureSocket.connect("www.myserver.com",443);

(при условии, что "www.myserver.com" является областью названный в сертификате)

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