2013-05-22 29 views
1

我正嘗試使用SecureSocket連接到服務器。我正在使用SecureSocket類實現的FlashBuilder 4.6。問題是,創建SecureSocket對象並調用連接函數後,我得到ioError - 輸入2031和「無效」的serverCertificateStatus。服務器端的證書是自簽名的。有沒有什麼辦法可以讓閃存使用自簽名證書?SSL接受ActionScript 3中的自簽名證書

+0

通常,Flash在瀏覽器上工作;因此您必須在瀏覽器中爲Flash添加永久豁免才能避免此錯誤。如果你周圍的Google應該能夠找到你選擇的瀏覽器的各種說明。我不建議在生產現場使用。 – JeffryHouser

+0

感謝您的快速回復。問題在於它是一個網站上的Flash客戶端,任何人都可以用他們的瀏覽器啓動它,所以瀏覽器中的豁免無法解決問題。 –

+1

請勿在生產站點中使用自簽名證書。 – JeffryHouser

回答

1

您可以使用as3cryptoTLSSocket,而不是(我建議把我patched版本,它有補丁幾個關鍵issues),它也包含新的方法addTrustedCertificate,可能是你的情況幫助(只是增加了證書中* .der格式,無論如何都會被接受(自簽名,錯誤域名等))。

package 
{ 
    import com.hurlant.crypto.tls.SSLSecurityParameters; 
    import com.hurlant.crypto.tls.TLSConfig; 
    import com.hurlant.crypto.tls.TLSEngine; 
    import com.hurlant.crypto.tls.TLSSocket; 
    import com.hurlant.util.der.PEM; 
    import com.kamagames.core.util.log.Logger; 
    import com.kamagames.core.util.log.TraceTarget; 

    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.IOErrorEvent; 
    import flash.events.ProgressEvent; 
    import flash.events.SecurityErrorEvent; 
    import flash.net.SecureSocket; 
    import flash.utils.ByteArray; 

    public class sockettest extends Sprite 
    { 
     [Embed(source="cert.pem", mimeType="application/octet-stream")] 
     private static const cert_pem:Class; 

     private var tlssocket:TLSSocket; 
     private var secsocket:SecureSocket; 

     public function sockettest() 
     { 
      var cert_pem_bytes:ByteArray = new cert_pem(); 
      var cert_der:ByteArray = PEM.readCertIntoArray(cert_pem_bytes.readUTFBytes(cert_pem_bytes.bytesAvailable)); 

      var config:TLSConfig = new TLSConfig(TLSEngine.CLIENT, null, null, null, null, null, SSLSecurityParameters.PROTOCOL_VERSION); 
      config.ignoreCommonNameMismatch = true; 
      config.addTrustedCertificate(cert_der); 

      var socket:Object = new TLSSocket(null, 0, config); 
      socket.addEventListener(Event.CONNECT, log); 
      socket.addEventListener(ProgressEvent.SOCKET_DATA, log); 
      socket.addEventListener(Event.CLOSE, log); 
      socket.addEventListener(IOErrorEvent.IO_ERROR, log); 
      socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, log); 

      socket.connect("google.com", 443); 
     } 

     private function log(event:Event):void 
     { 
      trace(event.type); 
     } 
    } 
} 

理論上SecureSocket.addBinaryChainBuildingCertificate方法也可以幫助你,但我不知道這件事,可能是它僅適用於鏈式證書。

通常修補TLSSocketSecureSocket更適合應用,因爲它開源並獲取對通信處理更全面的控制,但SecureSocket是本地系統如所提到的(其與例如系統證書工作@ Reboog711該TLSSocket不能)

+0

我已經使用TLSSocket和我成功連接到服務器。連接後我發送一條消息並等待返回消息。現在我有一個從服務器讀取返回消息的問題。 var o_Bytes:ByteArray = new ByteArray(); tlssocket.readBytes(o_Bytes,0,tlssocket.bytesAvailable); 當我跟蹤o_Bytes時,它沒有任何內容,並且o_Bytes.length也是0 –

+0

您是否讀取了有關_ProgressEvent.SOCKET_DATA_套接字事件的數據? – fsbmain

+0

關於進度事件我正在調用rading數據的函數,是的。我已經添加了一個代碼段,我試圖使用 –

0
tlssocket.addEventListener(ProgressEvent.SOCKET_DATA, ESecureSocketData); 
private function ESecureSocketData(evt:ProgressEvent):void 
{ 
    StartTimer(); 

    ReadResponse(); 
    ParseMessage(); 
} 
private function ReadResponse():void 
{ 
    var o_Bytes:ByteArray = new ByteArray(); 

    tlssocket.readBytes(o_Bytes, 0, tlssocket.bytesAvailable); 

    for (var i:uint = 0; i < o_Bytes.length; i ++) { 
     o_Bytes.position = i; 
     str_Response  += String.fromCharCode(o_Bytes.readByte()); 
    } 
}