2011-09-28 37 views
12

tôi sử dụng Socket SSL và Trustmanager từ bên này Self signed SSLKhông thể xác thực chữ ký chứng chỉ?

nhưng tôi cứ bị lỗi sau:

09-28 19:52:41.942: WARN/System.err(10101): javax.net.ssl.SSLHandshakeException: org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate signature.

Điều gì là sai? Tôi đã kiểm tra các bài đăng khác nhau trên stackoverflow nhưng tôi không thể làm cho nó hoạt động.

Mã của tôi:

SchemeRegistry schemeRegistry = new SchemeRegistry(); 

// http scheme 

schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 

// https scheme 

schemeRegistry.register(new Scheme("https", new EasySSLSocketFactory(), 443)); 
params = new BasicHttpParams(); 
params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 1); 
params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(1)); 
params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false); 
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
HttpProtocolParams.setContentCharset(params, "utf8"); 
CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); 
credentialsProvider.setCredentials(new AuthScope("www.example.com", AuthScope.ANY_PORT), 
    new UsernamePasswordCredentials("user", "password")); 
clientConnectionManager = new ThreadSafeClientConnManager(params, schemeRegistry); 
context = new BasicHttpContext(); 
context.setAttribute("http.auth.credentials-provider", credentialsProvider); 

DefaultHttpClient client = new DefaultHttpClient(clientConnectionManager, params); 

HttpGet get = new HttpGet("https://www.example.com/web/restricted/form/formelement=512663"); 
HttpResponse response = client.execute(get, context); 

Log.w("Response ","Status line : "+ response.toString()); 
+13

Bạn cũng có thể kiểm tra cài đặt ngày và giờ trên điện thoại. Nếu các đồng hồ quá xa đồng bộ, bạn có thể gặp lỗi tương tự với điều này. –

Trả lời

2

lẽ Hầu hết các máy chủ trở lại chuỗi chứng chỉ với các cơ quan bạn không tin tưởng. (có nghĩa là: giấy chứng nhận quyền không được biết đến với thiết bị của bạn là đáng tin cậy) Giải pháp: cẩn thận kiểm tra giấy chứng nhận đến từ HTTPS trang web, và thêm quyền tương ứng để truststore của bạn - nhưng phần này có vẻ là phức tạp

(ở đây một số giải thích: http://groups.google.com/group/android-security-discuss/browse_thread/thread/0bf726de4f5275a3/391b900631d7f358)

+0

Hi Konstantin, Thx cho câu trả lời nhưng tôi nghĩ rằng tôi phải đăng nhập vào trang web này một cách khác, điều này là quá phức tạp. Trang web tôi muốn đăng nhập có biểu mẫu đăng nhập có thể được gửi qua HTTP, thông tin đăng nhập sau đó được xác thực và chuyển hướng qua SSL tới trang tôi muốn. Tôi nghĩ rằng một Bài đăng HTTP có cookie được lưu giữ từ một HTTPGet nên làm điều đó hay không? – Lars

+0

Bạn không thực hiện điều đó xa - bạn không bao giờ nhận được kết nối HTTPS. Bạn có thể thành công bằng cách gửi biểu mẫu HTTP, nhưng chuyển hướng qua SSH sẽ không hoạt động trừ khi bạn sắp xếp sự cố chứng chỉ - Đó là phía bạn không tin cậy máy chủ. Điều thú vị là, một số máy chủ bị lỗi và chỉ không thể xác minh chữ ký của khách hàng (đáng chú ý là JBoss có lỗi này) –

20

Như Michael Levy đã đề cập, lý do tôi nhận được ngoại lệ này là tôi đã để giả lập Android của tôi mở trong vài ngày và đồng hồ đã nhận được khá xa đồng bộ. Khi tôi khởi động lại trình mô phỏng, ngoại lệ đã biến mất.

+1

Tôi gặp sự cố tương tự trên thiết bị Galaxy Note vật lý không có SIM. Thật thú vị, trình duyệt tích hợp sẵn hoạt động tốt. Sau khi tôi cập nhật cài đặt đồng bộ hóa thời gian thành tự động, tôi không còn gặp phải bất kỳ lỗi nào. –

+1

Đúng, tôi đang gặp sự cố với bắt tay chứng chỉ và thấy rằng thời gian thiết bị của tôi không được đặt đúng. Nó đã được thiết lập để somethings trong quá khứ và ssl bắt tay thất bại. –

8

Lưu ý quan trọng:

Hãy chắc chắn rằng thời gian trên thiết bị là đúng, chứng chỉ có thời hạn hiệu lực và sẽ không xác nhận nếu như thời gian được thiết lập để quá khứ (thường là ngày 1 tháng 1 năm 2000 sau khi một nhà máy đặt lại) hoặc tương lai. Thiết bị sẽ tự động đồng bộ hóa qua NTP, nhưng điều đó rõ ràng không hoạt động khi không có kết nối Internet có thể sử dụng.

+0

CẢM ƠN BẠN !!!! Tôi đã thiết lập thời gian thiết bị để quay trở lại một số ngày khác để kiểm tra hiển thị của một cái gì đó .... và sau đó quên đặt nó trở lại! Ngớ ngẩn. Cảm ơn! – marienke

1

BTW , chúng tôi có thể tái sản xuất lỗi này dễ dàng - chỉ cần thay đổi ngày của điện thoại thành vài năm sau đó.

LƯU Ý: lỗi có thể có sự khác biệt nhỏ trong điện thoại khác. Một số có thể cho thấy rằng chứng chỉ đã hết hạn.

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