1

我正在尝试使用 SecureSocket 连接到服务器。我正在使用实现了 SecureSocket 类的 FlashBuilder 4.6。问题是在创建 SecureSocket 对象并调用连接函数后,我得到 ioError - 类型 2031 和 serverCertificateStatus 的“无效”。服务器端的证书是自签名的。flash 有什么方法可以使用自签名证书吗?

4

2 回答 2

1

您可以改用(我建议使用我的补丁版本,它有几个关键问题的补丁),它还包含可能对您有帮助的新方法(只需添加 *.der 格式的证书,任何案例(自签名,错误的域等))。as3crypto TLSSocketaddTrustedCertificate

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方法也可能对您有所帮助,但我不确定,可能仅适用于链式证书。

一般来说,patchedTLSSocketSecureSocket应用程序更适合,因为它开源并获得对通信过程的更多整体控制,但正如@Reboog711 提到的那样,它是系统原生的(例如它不能SecureSocket与系统证书一起使用)TLSSocket

于 2013-05-22T15:29:05.080 回答
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() );
    }
}
于 2013-05-24T06:40:45.867 回答