2012-01-26 84 views
7

Mục tiêu của tôi: Tạo cấu hình Wi-Fi EAP - bao gồm Chứng chỉ CA - trong Android theo chương trình.Làm thế nào để cài đặt một chứng chỉ CA (cho cấu hình WiFi EAP) trong chương trình?

Sự cố: Làm cách nào để cài đặt chứng chỉ CA theo lập trình (và sau đó tham chiếu chứng chỉ đó trong cấu hình Wi-Fi EAP)?

Tôi tìm thấy một liên kết rất hữu ích đã cho phép tôi để tạo ra và lưu cấu hình WiFi EAP ở đây: How to programmatically create and read WEP/EAP WiFi configurations in Android?

Tuy nhiên điều này giả định rằng bạn đã cài đặt chứng chỉ CA trên thiết bị. Tôi muốn cài đặt chứng chỉ trong ứng dụng của mình - từ tài nguyên trong ứng dụng hoặc được gửi từ máy chủ.

Điều này có thể thực hiện được không? (Root không phải là một lựa chọn trong trường hợp này.) Nếu vậy, làm thế nào?

thông tin bổ sung ...

Tôi cũng tìm thấy một cách để thêm một chứng chỉ để một KeyStore: https://stackoverflow.com/a/4490543/1172101

Tuy nhiên này được sử dụng đặc biệt cho việc tạo ra một ổ cắm an toàn và kết nối thông qua HTTPS. Tôi muốn sử dụng chứng chỉ cho WiFi.


Thật không may, tôi chưa tìm cách cài đặt chứng chỉ CA theo chương trình - từ bên trong ứng dụng.

Tuy nhiên, bạn có thể cài đặt chứng chỉ qua trình duyệt Web trong Android. Do đó, giải pháp (hiện tại) là: Khởi chạy ý định mở URL trong trình duyệt Web đi trực tiếp vào chứng chỉ CA.

này hoạt động nhưng có một số thách thức:

  • Người dùng phải đặt tên cho chứng chỉ. Đây là một thách thức bởi vì chúng tôi đang bổ sung thêm cấu hình WiFi theo chương trình. Vì vậy, chúng tôi phải yêu cầu người dùng cung cấp cho chứng chỉ cùng tên.
  • Người dùng phải nhập mật khẩu. Nếu họ không thiết lập mật khẩu, người dùng sẽ tạo một mật khẩu và nhập mật khẩu hai lần. Nếu họ đã đặt mật khẩu bảo mật, người dùng sẽ phải nhớ cùng một mật khẩu và nhập mật khẩu đó.
  • Giả sử người dùng hoàn tất thành công các bước này, anh ta bị treo trái trong trình duyệt.

Điều này dẫn đến một vài câu hỏi:

  • Từ ứng dụng của tôi, là có một cách để buộc một tên cho chứng chỉ mà người dùng cài đặt thông qua trình duyệt?
  • Từ ứng dụng của tôi, có cách nào để biết khi cài đặt chứng chỉ đã hoàn thành và sau đó lấy lại tập trung vào ứng dụng của tôi không?

Hãy cho tôi biết nếu bạn cần làm rõ.

Trả lời

6

Bạn không thể cài đặt trực tiếp vì ứng dụng không thuộc hệ thống không có quyền truy cập vào lưu trữ khóa.Trên ICS, có một API cho KeyChain.createInstallIntent() này sẽ khởi chạy hộp thoại hệ thống yêu cầu người dùng có muốn cài đặt chứng chỉ hay không. Trên pre-ICS, bạn có thể đạt được điều tương tự bằng cách khởi chạy mục đích cài đặt bằng cách sử dụng tên thành phần trực tiếp (điều này có thể hoặc có thể không hoạt động trên tất cả các thiết bị). Đi qua trình duyệt thực sự là một cách vòng xoay để làm điều tương tự.

Đối với câu hỏi của bạn:

  1. bạn không thể xác định/buộc một cái tên. Tại sao bạn quan tâm đến tên thật?
  2. Không thực sự thông qua trình duyệt. Nếu bạn sử dụng ý định hệ thống, bạn có thể quay lại hoạt động của mình và sẽ nhận được cuộc gọi lại nếu bạn sử dụng startActivityForResult().

Cập nhật: Android 4.3 có WifiEnterpriseConfig cả hai đều tạo hồ sơ và cài đặt khóa và chứng chỉ trong kho lưu trữ thông tin xác thực hệ thống. Bạn chỉ cần sự cho phép của CHANGE_WIFI_STATE.

+0

Xin chào Nikolay, tôi đã đọc bài đăng Keystore của bạn ở đây: - http://nelenkov.blogspot.in/2012/05/storing-application-secrets-in-androids.html Tôi có thể sử dụng điều này để lập trình chứng chỉ Ca từ ứng dụng vào lớp WifiConfiguration. Lớp WifiConfiguration sẽ tham chiếu đến kho khóa ứng dụng của tôi trên kho khóa hệ thống –

0

Tôi đang tìm cho cùng ... như đối với câu hỏi của bạn, @Nikolay:

bạn không thể xác định/buộc một cái tên. Tại sao bạn quan tâm đến tên thật?

Cấu hình EAP cần tên của CA đã được cài đặt sẵn. Nếu bạn nhìn vào ví dụ trong phần 4, bạn có thể chỉ định:

final String ENTERPRISE_CA_CERT = ""; 

Trong ví dụ này, hồ sơ không sử dụng tên CA, nhưng điều đó có thể là trường hợp cho các cấu EAP khác.

0

Tôi hiện đang tìm cách giải quyết cùng một vấn đề. Điều tốt nhất mà tôi đã tìm thấy là KeyChain.choosePrivateKeyAlias ​​() cho phép người dùng chọn chứng chỉ để sử dụng cho SSL. Từ đó bạn có thể lấy tên Alias ​​và chuyển nó vào cấu hình wifi của doanh nghiệp.

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