![](/img/trans.png)
[英]flash builder 4 : flash.net.SecureSocket can not be found
[英]Flash SecureSocket and RSA private key
我正在尝试通过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, 0, 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, false, 0, 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名称不匹配。
考虑到您正在连接到本地主机(127.0.0.1),因此肯定会出现不匹配的情况。 Flash套接字在建立安全连接时特别严格,并且与其他运行时(例如.NET和Java)不同,没有机制可以覆盖安全性功能。 必须满足以下条件:
*.bob.com
的证书被认为对mr.bob.com
有效) 其次:
您似乎对证书的工作方式有一些误解。 如果服务器证书是由受信任的根证书颁发机构颁发的,即对服务器证书进行签名的证书位于目标设备的本地信任存储中,则无需使用addBinaryChainBuildingCertificate()
方法添加任何证书。
为了显示:
this.is.awesome.com
的证书,并且有一个DNS条目将this.is.awesome.com
解析为服务器的IP地址。 在我的PC上,我的受信任的根证书存储区中安装了Entrust 2048根权限。 但是,我没有安装L1C证书。 当我尝试连接到this.is.awesome.com
,连接将失败,因为无法根据L1C权限验证服务器证书。
如果我使用addBinaryChainBuildingCertificate()
添加DER编码的L1C证书,则连接将成功。 服务器证书将根据L1C证书进行验证,而L1C证书随后将根据2048根证书(即受信任的根)进行验证。
总结一下:
您的连接问题似乎源于您尝试连接到本地主机。 尝试将一个条目添加到HOSTS文件中,该条目将证书上的名称映射到127.0.0.1,然后连接到该名称。 如果失败,请检查证书上的颁发者链,并通过对链中的每个颁发证书调用一次addBinaryChainBuildingCertificate()
来添加颁发者链。 最终证书或根证书应通过将true
作为第二个参数传递给addBinaryChainBuildingCertificate()
进行标记
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.