2012-07-03 6 views
8

SSL을 통해 서버와 통신하려고합니다. PEM 클라이언트 파일은 인증서와 rsa 개인 키로 구성됩니다.플래시 SecureSocket 및 RSA 개인 키

인증서와 키를 모두 DER로 변환 할 수있었습니다. DER 인증서를 SecureSocket에 성공적으로로드합니다 (함수가 , addBinaryChainBuildingCertificate가).하지만 서버에 연결하려고하면 "주된 불일치"오류가 발생합니다. DER 키를로드하기 위해 앞에서 설명한 함수를 사용하려고하면 "잘못된 매개 변수"오류가 발생합니다.

개인 키를로드하지 않았기 때문에 "주요 불일치"가 있다고 가정합니다. 하지만 SecureSocket에 RSA 키를로드하는 기능은 없습니다. 이것에 대한 해결책이 있습니까? 인증서 만 사용하여 서버와 통신해야하지만 방정식에서 키를 제거해야합니까?

편집 :

코드 :

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);

012,351을 6,

내가 얻을 : 첫째

SecureSocket.isSupported true 
certificate 497 
key 607 
ERROR! Error #2031: Socket Error. URL: 127.0.0.1 : principalMismatch 
+1

에 socket.connect 할 때 인증서가로드되고 유효성이 확인되도록 을 두 번째 매개 변수로 전달하여 표시해야합니다. 그 외에는 코드 나 특정 오류 코드를 게시하지 않았으므로 도움이되지 않습니다. –

+0

추가되었지만 실제로 도움이 될만한 방법을 볼 수는 없습니다 :-(로컬 서버가 pem 파일에서 인증서와 키를 읽는 로컬 C++ 클라이언트와 잘 작동하는지 추가 할 수있게하십시오. –

+0

로컬로 SWF를 시작하거나 웹에 테스트 되었습니까? –

답변

3

:

은 "주요 불일치"는 보안 서버 인증서의 일반 이름은 연결중인 DNS 이름과 일치하지 않음을 나타냅니다.

localhost (127.0.0.1)에 연결하는 것을 고려할 때 확실히 불일치가 발생합니다. 플래시 소켓은 보안 연결을 만들 때 특히 엄격하며 다른 런타임 (예 : .NET 및 Java)과 달리 보안 기능을 재정의 할 수있는 메커니즘이 없습니다. 다음 조건을 충족해야합니다

  1. 인증서 일반 이름 걸쭉한는
  2. 인증서가 있어야합니다 (이완이 '스타'인증서 표시가 *.bob.com에 대한 인증서가 mr.bob.com을 위해 유효한 것으로 간주됩니다 즉 여기있다) DNS 이름과 일치 만료과 신뢰 체인 둘째

의 측면에서 유효가 :

당신은 어떻게 인증서 작업에 대한 몇 가지 오해를 갖고있는 것 같다. 신뢰할 수있는 루트 기관에서 서버 인증서를 발급 한 경우, 즉 서버 인증서에 서명 한 인증서가 대상 장치의 로컬 트러스트 저장소에있는 경우 addBinaryChainBuildingCertificate() 메서드를 사용하여 인증서를 추가 할 필요가 없습니다.

는 설명하기 :

  • 내 서버에 설치 this.is.awesome.com에 대한 인증서 및 내 서버의 IP 주소
  • 이 인증서는 러스트 L1C 인증 기관에서 발급에 this.is.awesome.com를 해결하는 DNS 항목이.
  • L1C 인증서는 Entrust 2048 루트 권한에 의해 발급됩니다.

내 PC에는 신뢰할 수있는 루트 인증서 저장소에 Entrust 2048 루트 권한이 설치되어 있습니다. 그러나 L1C 인증서가 설치되어 있지 않습니다. this.is.awesome.com에 연결을 시도하면 L1C 기관에 대해 서버 인증서의 유효성을 검사 할 수 없기 때문에 연결이 실패합니다.

addBinaryChainBuildingCertificate()을 사용하여 DER로 인코딩 된 L1C 인증서를 추가하면 연결이 성공합니다. 서버 인증서는 신뢰할 수있는 루트 인 2048 루트 인증서에 대해 유효성이 검사되는 L1C 인증서에 대해 유효성이 검사됩니다.

은 요약하면 :

연결 문제는 로컬 호스트에 연결하기위한 시도에서 줄기 것 같다. 인증서의 이름을 127.0.0.1로 매핑 한 항목을 HOSTS 파일에 추가 한 다음 해당 이름에 연결해보십시오. 실패한 경우 인증서의 발급자 체인을 확인하고 체인의 각 발급 인증서에 대해 addBinaryChainBuildingCertificate() 번씩 호출하여 발급자 체인을 추가합니다. 최종 또는 루트 인증서는