8

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
4

1 に答える 1

3

まず:

「主な不一致」は、セキュリティで保護されたサーバー上の証明書の共通名が、接続しているDNS名と一致しないことを示します。

ローカルホスト(127.0.0.1)に接続していることを考えると、間違いなく不一致があります。フラッシュソケットは、安全な接続を確立する場合に特に厳格であり、他のランタイム(.NETやJavaなど)とは異なり、セキュリティ機能をオーバーライドするメカニズムはありません。次のことが当てはまる必要があります。

  1. 証明書の一般名はDNS名と一致します(「スター」証明書には緩和があります。つまり、の証明書*.bob.comは有効と見なされますmr.bob.com
  2. 証明書は、有効期限と信頼のチェーンの観点から有効である必要があります

第二に:

証明書がどのように機能するかについて、いくつかの誤解があるようです。addBinaryChainBuildingCertificate()サーバー証明書が信頼されたルート機関によって発行されている場合、つまりサーバー証明書に署名した証明書がターゲットデバイスのローカルトラストストアにある場合は、この方法を使用して証明書を追加する必要はありません。

説明する:

  • this.is.awesome.comサーバーにインストールするための証明書this.is.awesome.comと、サーバーのIPアドレスに解決されるDNSエントリがあります
  • この証明書は、EntrustL1C認証局によって発行されます。
  • L1C証明書は、Entrust2048ルート機関によって発行されます。

私のPCでは、信頼されたルート証明書ストアにEntrust2048ルート権限がインストールされています。ただし、L1C証明書がインストールされていません。this.is.awesome.comサーバー証明書をL1C権限に対して検証できないため、接続しようとすると失敗します。

を使用してDERエンコードされたL1C証明書を追加するaddBinaryChainBuildingCertificate()と、接続は成功します。サーバー証明書はL1C証明書に対して検証され、L1C証明書は信頼されたルートである2048ルート証明書に対して検証されます。

要約する:

接続の問題は、ローカルホストに接続しようとしたことに起因しているようです。証明書の名前を127.0.0.1にマップするエントリをHOSTSファイルに追加してから、その名前に接続してみてください。それが失敗した場合は、証明書の発行者チェーンを確認し、チェーンaddBinaryChainBuildingCertificate()内の発行証明書ごとに1回呼び出すことにより、発行者のチェーンを追加します。true最終証明書またはルート証明書は、2番目のパラメーターとしてに渡すことによってそのようにマークする必要がありますaddBinaryChainBuildingCertificate()

于 2012-11-21T05:56:08.537 に答える