actionscript-3 – Flash SecureSocket和RSA私钥
我正在尝试通过SSL与服务器通信. PEM客户端文件由证书和rsa私钥组成.
我设法将证书和密钥转换为二进制DER.我成功地将DER证书加载到SecureSocket(使用函数addBinaryChainBuildingCertificate),但是当我尝试连接到服务器时,我收到“主要不匹配”错误.如果我尝试使用上述功能加载DER键,我会收到“错误的参数”错误. 我认为“主要不匹配”是因为我没有加载私钥.但是我没有看到将RSA密钥加载到SecureSocket的功能.这有什么解决方案吗?我是否需要仅使用证书与服务器通信,但是从等式中删除密钥? 编辑: 代码: package { import flash.display.Sprite; import flash.net.SecureSocket; import flash.net.URLLoader; import flash.events.ProgressEvent; import flash.events.Event; import flash.events.IOErrorEvent; import flash.net.URLLoaderDataFormat; import flash.net.URLRequest; import flash.utils.ByteArray; public class TestSSL2 extends Sprite { private var mSocket:SecureSocket = new SecureSocket(); private var certFile:String = "ca.der"; private var keyFile:String = "key.der"; private var cert:ByteArray; private var key:ByteArray; public function TestSSL2() { trace("SecureSocket.isSupported",SecureSocket.isSupported); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE,certLoaded,false,true); urlLoader.dataFormat = URLLoaderDataFormat.BINARY; urlLoader.load(new URLRequest(certFile)); } private function certLoaded(e:Event):void { cert = (e.target as URLLoader).data; trace("certificate",cert.length); mSocket.addBinaryChainBuildingCertificate(cert,true); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE,keyLoaded,true); urlLoader.dataFormat = URLLoaderDataFormat.BINARY; urlLoader.load(new URLRequest(keyFile)); } private function keyLoaded(e:Event):void { key = (e.target as URLLoader).data; trace("key",key.length); mSocket.addBinaryChainBuildingCertificate(key,true); mSocket.connect("127.0.0.1",3000); mSocket.addEventListener(Event.CONNECT,socketConnected); mSocket.addEventListener(IOErrorEvent.IO_ERROR,onError); mSocket.addEventListener(ProgressEvent.SOCKET_DATA,socketData ); } private function onError(error:IOErrorEvent):void { trace("ERROR!",error.text,":",mSocket.serverCertificateStatus); } private function socketConnected(e:Event):void { trace("Connected",e); } private function socketData(e:*):void { var data:String; data = mSocket.readUTFBytes(mSocket.bytesAvailable); trace(data); } } } 结果: SecureSocket.isSupported true certificate 497 key 607 ArgumentError: Error #2004: One of the parameters is invalid. at flash.net::SecureSocket/addBinaryChainBuildingCertificate() at TestSSL2/keyLoaded() at flash.events::EventDispatcher/dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at flash.net::URLLoader/onComplete() 如果我评论该行: //mSocket.addBinaryChainBuildingCertificate(key,true); 我明白了: SecureSocket.isSupported true certificate 497 key 607 ERROR! Error #2031: Socket Error. URL: 127.0.0.1 : principalMismatch 解决方法
首先:
“主要不匹配”表示安全服务器上的证书的公用名与您要连接的DNS名称不匹配. 考虑到您正在连接到localhost(127.0.0.1),肯定会出现不匹配的情况.在进行安全连接时,Flash套接字特别严格,并且与其他运行时(例如.NET和Java)不同,没有机制可以覆盖安全功能.必须满足以下条件: >证书通用名称与DNS名称相匹配(这里有’明星’证书放宽,即* .bob.com的证书被认为对mr.bob.com有效) 其次: 您似乎对证书的工作方式存在一些误解.如果服务器证书由受信任的根颁发机构颁发,即签署服务器证书的证书位于目标设备的本地信任库中,则无需使用addBinaryChainBuildingCertificate()方法添加任何证书. 为了显示: >我在我的服务器上安装了this.is.awesome.com的证书,以及将this.is.awesome.com解析为我服务器的IP地址的DNS条目 在我的PC上,我在受信任的根证书存储区中安装了Entrust 2048 Root权限. 如果我使用addBinaryChainBuildingCertificate()添加DER编码的L1C证书,则连接将成功.将根据L1C证书验证服务器证书,而L1C证书将根据作为受信任根的2048根证书进行验证. 总结一下: 您的连接问题似乎源于您尝试连接到localhost.尝试在HOSTS文件中添加一个条目,将证书上的名称映射到127.0.0.1,然后连接到该名称.如果失败,请检查证书上的颁发者链,并通过为链中的每个颁发证书调用addBinaryChainBuildingCertificate()一次来添加发行者链.最终或根证书应该通过将true作为第二个参数传递给addBinaryChainBuildingCertificate()来标记 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |