2012-07-03 17 views
8

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 
+1

に、trueを2番目のパラメータとして渡して、そのようにマークする必要があります。socket.connectを実行すると、証明書がロードされ、検証されますか?あなたがコードを投稿しなかったり特定のエラーコードを表示したりしなかったので、私はそれ以外のことはできません。 –

+0

追加されましたが、それがどのように役立つかを実際に見ることはできません:-(Pemファイルから証明書とキーを読み取るローカルのC++クライアントでローカルサーバーが正常に動作することを追加できます。 –

+0

SWFをローカルまたはテストされたテストはウェブにありますか? –

答えて

3

「校長のミスマッチが」保護されたサーバー上の証明書の共通名は、接続先のDNS名と一致しないことを示しています。

ローカルホスト(127.0.0.1)への接続を検討していると、間違いがあります。フラッシュソケットは、セキュリティで保護された接続を作成する場合や、他のランタイム(.NETやJavaなど)とは異なり、セキュリティ機能を無効にするメカニズムがない場合は特に厳しいです。以下を満たしている必要があります

  1. 証明書の共通名マッシュは、DNS名と一致する(緩和は「スター」certsのためにここにあり*.bob.comのための証明書がmr.bob.comのために有効であると考えられるIE)証明書がなければなりません
  2. 有効期限と信頼チェーン第二

の観点:

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

は説明するために:

  • 私は私のサーバーにインストールthis.is.awesome.com用の証明書と私のサーバーのIPアドレス
  • この証明書は、EntrustのL1C証明機関によって発行されたにthis.is.awesome.comを解決するDNSエントリを持っています。
  • L1C証明書は、Entrust 2048ルート権限によって発行されます。

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

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

要約すると:

をお使いの接続の問題は、ローカルホストに接続するためにあなたの試みから生じるように見えます。 証明書の名前を127.0.0.1にマッピングし、その名前に接続するエントリをHOSTSファイルに追加してください。それが失敗した場合は、証明書の発行者チェーンをチェックし、チェーン内の発行証明書ごとにaddBinaryChainBuildingCertificate()を1回呼び出して発行者のチェーンを追加します。最終証明書またはルート証明書には、

関連する問題