2012-07-03 31 views
8

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

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ể. –

+0

Đã 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 –

+0

Bạn đang khởi chạy SWF cục bộ hay –

Trả lời

3

Thứ nhất:

Các "không phù hợp chính" chỉ ra rằng tên gọi chung của các chứng chỉ trên máy chủ bảo đảm không trùng với tên DNS mà bạn đang kết nối.

Xét rằng bạn đang tạo kết nối với máy chủ cục bộ (127.0.0.1), chắc chắn sẽ không khớp. Ổ cắm flash đặc biệt nghiêm ngặt khi tạo kết nối an toàn và không có cơ chế ghi đè các tính năng bảo mật không giống như các thời gian chạy khác (ví dụ: .NET và Java). Sau đây phải đúng:

  1. Giấy chứng nhận tên gọi chung chuyện lãng mạn phù hợp với tên DNS (có sự thư giãn vào đây để 'sao' certs tức là một cert cho *.bob.com được coi là hợp lệ cho mr.bob.com)
  2. Giấy chứng nhận phải hợp lệ về hạn sử dụng và tin tưởng chuỗi

Thứ hai:

Bạn dường như có một số quan niệm sai lầm về cách giấy chứng nhận làm việc. Bạn không cần thêm bất kỳ chứng chỉ nào bằng cách sử dụng phương thức addBinaryChainBuildingCertificate() nếu chứng chỉ máy chủ được cấp bởi cơ quan gốc đáng tin cậy tức là chứng chỉ đã ký chứng chỉ máy chủ nằm trong kho lưu trữ tin cậy cục bộ của thiết bị mục tiêu.

Để minh họa:

  • Tôi có một chứng chỉ cho this.is.awesome.com được cài đặt trên máy chủ của tôi và mục DNS mà giải quyết this.is.awesome.com đến địa chỉ IP máy chủ của tôi
  • Chứng chỉ này được ban hành bởi các cơ quan chứng nhận Entrust L1C.
  • Chứng chỉ L1C lần lượt được cấp bởi cơ quan gốc Entrust 2048.

Trên máy tính của tôi Tôi có cơ quan Gốc ủy quyền Entrust 2048 được cài đặt trong kho chứng chỉ Trusted Root của tôi. Tuy nhiên, tôi chưa cài đặt chứng chỉ L1C. Khi tôi cố gắng kết nối với this.is.awesome.com kết nối sẽ không thành công do chứng chỉ máy chủ không thể được xác thực đối với quyền L1C.

Nếu tôi thêm chứng chỉ L1C được mã hóa DER bằng cách sử dụng addBinaryChainBuildingCertificate() thì kết nối sẽ thành công. Chứng chỉ máy chủ sẽ được xác nhận hợp lệ đối với chứng chỉ L1C mà lần lượt sẽ được xác nhận hợp lệ đối với chứng chỉ gốc 2048 là chứng chỉ gốc đáng tin cậy.

Để tóm tắt:

các vấn đề kết nối của bạn dường như xuất phát từ nỗ lực của bạn để kết nối với localhost. Thử thêm một mục nhập vào tệp HOSTS của bạn để ánh xạ tên trên chứng chỉ của bạn lên 127.0.0.1 và sau đó kết nối với tên đó. Nếu điều đó không kiểm tra chuỗi nhà phát hành trên chứng chỉ của bạn và thêm chuỗi các tổ chức phát hành bằng cách gọi addBinaryChainBuildingCertificate() một lần cho mỗi chứng chỉ phát hành trong chuỗi. Chứng chỉ cuối cùng hoặc gốc phải được đánh dấu như vậy bằng cách chuyển true làm tham số thứ hai cho addBinaryChainBuildingCertificate()

Các vấn đề liên quan