我正在为Android开发AIR(Flex)移动应用程序,它需要使用SSL或TSL与http服务器通信。我使用Firefox获得了CA证书链(也使用其他工具检查过)并得到以下链:
划伤的是我公司的SSL / TSL服务器。出于安全考虑,我不想发布其地址。 因此,在找到我需要的证书(链中只有两个)后,我在Android平板电脑上搜索了哪些证书已安装。正如您在下一张图片中所见,系统上已安装了根证书“VeriSign Class 3 Public Primary Certification Authority - G5”:
我需要下载的唯一一个是“VeriSign Class 3 Secure Server CA - 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>
对于最后一种方法,我甚至没有得到要求证书授权的消息框,我只得到一个错误,上面写着:“错误#2031:套接字错误。 URL:https://www.myserver.com/,服务器证书状态:无效“。 我想知道为什么AIR(Flex)移动运行时没有考虑已经安装在Android证书存储上的证书,它仍然要求用户授权,或者甚至最糟糕的是,提供错误并说服务器证书无效。有谁知道为什么会这样?我错过了什么吗?
我们将不胜感激。
答案 0 :(得分:0)
不是真正的答案,而是SecureSocket -
您可以使用以编程方式添加自己的证书 addBinaryChainBuildingCertificate()方法
答案 1 :(得分:0)
只需更改
secureSocket.connect( “https://www.myserver.com/”,443);
到
secureSocket.connect( “www.myserver.com”,443);
(假设“www.myserver.com”是证书中指定的域名)