我正在尝试使用 SecureSocket 连接到服务器。我正在使用实现了 SecureSocket 类的 FlashBuilder 4.6。问题是在创建 SecureSocket 对象并调用连接函数后,我得到 ioError - 类型 2031 和 serverCertificateStatus 的“无效”。服务器端的证书是自签名的。flash 有什么方法可以使用自签名证书吗?
问问题
2877 次
2 回答
1
您可以改用(我建议使用我的补丁版本,它有几个关键问题的补丁),它还包含可能对您有帮助的新方法(只需添加 *.der 格式的证书,任何案例(自签名,错误的域等))。as3crypto
TLSSocket
addTrustedCertificate
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
方法也可能对您有所帮助,但我不确定,可能仅适用于链式证书。
一般来说,patchedTLSSocket
比SecureSocket
应用程序更适合,因为它开源并获得对通信过程的更多整体控制,但正如@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 回答