2012-06-10 29 views
6

Tôi đã tạo ứng dụng Phonegap cần giao tiếp với dịch vụ SSL tự ký.Yêu cầu SSL tên miền chéo trong Phonegap/Cordova không hoạt động sau khi xuất APK

tôi trong danh sách trắng url của tôi trong res/xml/cordova.xml như vậy:

<access origin="https://www.mydomain.com" subdomains="true" />

và điều này hoạt động tốt khi tôi chạy và xây dựng từ nhật thực nhưng nếu tôi sau đó xuất khẩu và đăng ký ứng dụng của tôi và bằng tay cài đặt APK sau đó ứng dụng không thể kết nối với dịch vụ web của tôi.

Các thông tin liên lạc với máy chủ được thực hiện bằng cách sử dụng thư viện Sencha Touch như vậy:

Ext.Ajax.request({ 
     url: 'https://www.mydomain.com', 
     method: 'get',   
     success: function(result) {     
     }, 
     failure: function(result) {   
     }   
    }); 

Bất kỳ giúp nhiều đánh giá cao

Trả lời

10

Vấn đề là bạn đang sử dụng một cert ký tự. Android WebView không cho phép theo chứng chỉ SSL tự ký mặc định. PhoneGap/Cordova overrides this in the CordovaWebViewClient class nhưng không phân biệt hành vi của nó nhiều; nếu ứng dụng được gỡ lỗi, nó sẽ proceed và bỏ qua lỗi, nếu không nó sẽ thất bại.

Bạn có thể thay đổi mã được liên kết trên thành mã trong ứng dụng của mình và thực hiện phương thức onReceivedSslError luôn gọi handler.proceed() - nhưng điều này không được khuyến nghị. Không sử dụng chứng chỉ tự ký!

+0

Có, tôi có một cert SSL ký và nó làm việc tốt. Cảm ơn bạn đã giúp đỡ. –

+0

@DeanWild Tôi cũng gặp vấn đề tương tự, bạn có yêu cầu chứng chỉ SSL từ nhà cung cấp/máy chủ api của bạn và sử dụng nó để ký gói ứng dụng của bạn không? – JunM

+0

Bạn không mua chứng chỉ SSL từ nhà cung cấp (có nhiều nhà cung cấp, ví dụ: http://www.verisign.com/) sau đó bạn cài đặt chứng chỉ SSL này trên máy chủ web –

3

Tôi đã làm như sau để tránh xung đột (hiện đang sử dụng Cordova 1.7.0). Đây chắc chắn là vốn đã không an toàn:

public class MyWebViewClient extends CordovaWebViewClient { 

    public MyWebViewClient(DroidGap ctx) { 
     super(ctx); 
    } 

    @Override 
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { 
     // testing against getPrimaryError() or hasErrors() will fail on Honeycomb or older. 
     // You might check for something different, such as specific info in the certificate, 
     //if (error.getPrimaryError() == SslError.SSL_IDMISMATCH) { 
      handler.proceed(); 
     //} else { 
     // super.onReceivedSslError(view, handler, error); 
     //} 
    } 
} 

và sau đó trong hoạt động chính:

@Override 
public void init() { 
    super.init(); 

    //pass in our webviewclient to override SSL error 
    this.setWebViewClient(this.appView, new MyWebViewClient(this)); 
} 
Các vấn đề liên quan