簡體   English   中英

Flash SecureSocket和RSA私鑰

[英]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)不同,沒有機制可以覆蓋安全性功能。 必須滿足以下條件:

  1. 證書通用名稱必須與DNS名稱匹配(“星”證書在這里有一個松弛,即*.bob.com的證書被認為對mr.bob.com有效)
  2. 證書必須在有效期限和信任鏈方面有效

其次:

您似乎對證書的工作方式有一些誤解。 如果服務器證書是由受信任的根證書頒發機構頒發的,即對服務器證書進行簽名的證書位於目標設備的本地信任存儲中,則無需使用addBinaryChainBuildingCertificate()方法添加任何證書。

為了顯示:

  • 我在服務器上安裝了this.is.awesome.com的證書,並且有一個DNS條目將this.is.awesome.com解析為服務器的IP地址。
  • 該證書由Entrust L1C證書頒發機構頒發。
  • L1C證書又由Entrust 2048根頒發機構頒發。

在我的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM