Tôi đang cố gắng liên lạc với máy chủ thông qua SSL. Tệp khách hàng PEM bao gồm chứng chỉ và khóa cá nhân rsa.Flash SecureSocket và khóa riêng RSA
Tôi đã quản lý chuyển đổi cả chứng chỉ và khóa thành DER nhị phân. Tôi tải chứng chỉ DER thành SecureSocket thành công (với chức năng addBinaryChainBuildingCertificate) nhưng khi tôi cố gắng kết nối với máy chủ, tôi nhận được lỗi "không khớp chính". Nếu tôi cố gắng sử dụng chức năng nói trên để tải khóa DER, tôi gặp lỗi "thông số sai".
Tôi cho rằng "không khớp chính" là vì tôi chưa tải khóa cá nhân. Nhưng tôi thấy không có chức năng để tải một khóa RSA để SecureSocket. Có giải pháp nào cho điều này không? Tôi có cần giao tiếp với máy chủ chỉ bằng chứng chỉ nhưng xóa khóa khỏi phương trình không?
EDIT:
Code:
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);
}
}
}
Kết quả:
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()
Nếu tôi nhận xét dòng:
//mSocket.addBinaryChainBuildingCertificate(key, true);
tôi nhận được:
SecureSocket.isSupported true
certificate 497
key 607
ERROR! Error #2031: Socket Error. URL: 127.0.0.1 : principalMismatch
Certs được tải và xác thực khi bạn thực hiện socket.connect? Khác hơn là tôi không thể giúp như bạn đã không đăng mã và mã lỗi cụ thể. –
Đã thêm, nhưng không thể thực sự thấy nó có thể giúp như thế nào :-(Cho phép tôi thêm rằng máy chủ cục bộ hoạt động tốt với máy khách C++ cục bộ đọc chứng chỉ và khóa từ tệp pem –
Bạn đang khởi chạy SWF cục bộ hay –