SSLを使用してサーバーと通信しようとしています。 PEMクライアントファイルは、証明書とrsa秘密鍵で構成されています。Flash SecureSocketとRSA秘密鍵
証明書とキーの両方をバイナリDERに変換することができました。 DER証明書をSecureSocketに正常にロードします(関数addBinaryChainBuildingCertificate)が、サーバーに接続しようとすると「プリンシパルの不一致」エラーが発生します。上記の関数を使用してDERキーをロードしようとすると、「間違ったパラメータ」エラーが発生します。
「プリンシパルミスマッチ」は私が秘密鍵をロードしていないためだと思います。しかし、SecureSocketにRSA鍵をロードする機能はありません。これには何か解決策はありますか?証明書だけでサーバーと通信する必要がありますが、式からキーを削除する必要はありますか?
EDIT:
コード:
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);
}
}
}
結果:
//mSocket.addBinaryChainBuildingCertificate(key, true);
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()
私は行をコメントした場合
私が取得:まず
SecureSocket.isSupported true
certificate 497
key 607
ERROR! Error #2031: Socket Error. URL: 127.0.0.1 : principalMismatch
に、
true
を2番目のパラメータとして渡して、そのようにマークする必要があります。socket.connectを実行すると、証明書がロードされ、検証されますか?あなたがコードを投稿しなかったり特定のエラーコードを表示したりしなかったので、私はそれ以外のことはできません。 –追加されましたが、それがどのように役立つかを実際に見ることはできません:-(Pemファイルから証明書とキーを読み取るローカルのC++クライアントでローカルサーバーが正常に動作することを追加できます。 –
SWFをローカルまたはテストされたテストはウェブにありますか? –