Làm cách nào để cài đặt chứng chỉ CA đáng tin cậy trên thiết bị Android?


134

Tôi đã tạo chứng chỉ CA của riêng mình và bây giờ tôi muốn cài đặt nó trên thiết bị Android Froyo của mình (HTC Desire Z), để thiết bị tin cậy chứng chỉ của tôi.

Android lưu trữ chứng chỉ CA trong kho khóa Java của nó /system/etc/security/cacerts.bks. Tôi đã sao chép tệp vào máy tính của mình, thêm chứng chỉ của mình bằng portecle 1.5 và đẩy nó trở lại thiết bị.

Bây giờ, Android dường như không tải lại tệp tự động. Tôi đã đọc trong một số bài đăng trên blog rằng tôi cần khởi động lại thiết bị. Làm như vậy sẽ dẫn đến việc tập tin bị ghi đè bằng bản gốc một lần nữa.

Thử nghiệm tiếp theo của tôi là cài đặt chứng chỉ từ thẻ SD bằng cách sao chép nó và sử dụng tùy chọn theo từ menu cài đặt. Thiết bị cho tôi biết rằng chứng chỉ đã được cài đặt, nhưng dường như nó không tin tưởng vào chứng chỉ. Hơn nữa, khi tôi cố gắng sao chép kho khóa vào máy tính của mình, tôi vẫn tìm thấy kho gốc cacerts.bks.

Vậy, cách đúng đắn để cài đặt chứng chỉ CA gốc của tôi trên thiết bị Android 2.2 là chứng chỉ tin cậy là gì? Có cách nào để làm điều đó theo chương trình không?


Bạn có thể giả sử một điện thoại bắt nguồn từ đây. :)
Bjorn Marschollek

Câu trả lời:


115

Trước Android KitKat, bạn phải root thiết bị của mình để cài đặt chứng chỉ mới.

Từ Android KitKat (4.0) cho đến Nougat (7.0) đều có thể và dễ dàng. Tôi đã có thể cài đặt chứng chỉ Proxy gỡ lỗi Charles Web trên thiết bị chưa root của mình và đánh hơi thành công lưu lượng SSL.

Trích xuất từ http://wiki.cacert.org/FAQ/ImportRootCert

Trước phiên bản Android 4.0, với phiên bản Android Gingerbread & Froyo, đã có một tệp chỉ đọc (/system/etc/security/cacerts.bks) chứa kho tin cậy với tất cả các chứng chỉ CA ('system') được tin cậy theo mặc định trên Android. Cả ứng dụng hệ thống và tất cả các ứng dụng được phát triển với SDK Android đều sử dụng điều này. Sử dụng các hướng dẫn sau khi cài đặt chứng chỉ CAcert trên Android Gingerbread, Froyo, ...

Bắt đầu từ Android 4.0 (Android ICS / 'Ice Cream Sandwich', Android 4.3 'Jelly Bean' & Android 4.4 'KitKat'), các chứng chỉ tin cậy của hệ thống nằm trên phân vùng hệ thống (chỉ đọc) trong thư mục '/ system / etc / bảo mật / 'như các tệp riêng lẻ. Tuy nhiên, giờ đây người dùng có thể dễ dàng thêm chứng chỉ 'người dùng' của riêng mình sẽ được lưu trữ trong '/ data / misc / móc khóa / certs được thêm vào'.

Chứng chỉ được cài đặt hệ thống có thể được quản lý trên thiết bị Android trong Cài đặt -> Bảo mật -> Chứng chỉ -> phần 'Hệ thống', trong khi chứng chỉ tin cậy của người dùng được đưa vào phần 'Người dùng' ở đó. Khi sử dụng chứng chỉ tin cậy của người dùng, Android sẽ buộc người dùng thiết bị Android thực hiện các biện pháp an toàn bổ sung: sử dụng mã PIN, khóa mẫu hoặc mật khẩu để mở khóa thiết bị là bắt buộc khi sử dụng chứng chỉ do người dùng cung cấp.

Cài đặt chứng chỉ CAcert làm chứng chỉ 'người dùng đáng tin cậy' rất dễ dàng. Cài đặt chứng chỉ mới dưới dạng 'chứng chỉ tin cậy hệ thống' đòi hỏi nhiều công việc hơn (và yêu cầu quyền truy cập root), nhưng nó có lợi thế là tránh yêu cầu màn hình khóa Android.

Từ Android N trở đi,trở nên khó khăn hơn, xem phần trích xuất này từ trang web proxy Charles :

Kể từ Android N, bạn cần thêm cấu hình vào ứng dụng của mình để có thể tin tưởng các chứng chỉ SSL được tạo bởi Charles SSL Proxying. Điều này có nghĩa là bạn chỉ có thể sử dụng SSL Proxying với các ứng dụng mà bạn kiểm soát.

Để định cấu hình ứng dụng của bạn để tin tưởng Charles, bạn cần thêm Tệp cấu hình bảo mật mạng vào ứng dụng của mình. Tệp này có thể ghi đè mặc định hệ thống, cho phép ứng dụng của bạn tin tưởng các chứng chỉ CA đã cài đặt của người dùng (ví dụ: Chứng chỉ gốc Charles). Bạn có thể chỉ định rằng điều này chỉ áp dụng trong các bản dựng gỡ lỗi của ứng dụng của bạn, để các bản dựng sản xuất sử dụng hồ sơ tin cậy mặc định.

Thêm tệp res / xml / network_security_config.xml vào ứng dụng của bạn:

<network-security-config>    
    <debug-overrides> 
        <trust-anchors> 
            <!-- Trust user added CAs while debuggable only -->
            <certificates src="user" /> 
        </trust-anchors>    
    </debug-overrides>  
</network-security-config>

Sau đó thêm một tham chiếu đến tệp này trong tệp kê khai của ứng dụng của bạn, như sau:

<?xml version="1.0" encoding="utf-8"?> 
<manifest>
    <application android:networkSecurityConfig="@xml/network_security_config">
    </application> 
</manifest>

1
Các tệp chứng chỉ tùy chỉnh của tôi ( /system/etc/security/cacerts/*.0) không được giữ lại sau khi khởi động lại / khởi động lại AVD, vì vậy giải pháp này không thành công.
fikr4n

@BornToCode thú vị - Tôi hiếm khi sử dụng AVD vì vậy tôi không nhận thức được giới hạn này
Dean Wild

Tôi thấy cài đặt debug-overrides, điều đó có nghĩa là điều này network_security_configchỉ nhắm mục tiêu biến thể gỡ lỗi? Nếu tôi có biến thể khác như biến thể UAT thì cái này không hoạt động?
Isaac

1
@Isaac điều này có nghĩa là nó sẽ áp dụng cho bất kỳ biến thể nào có thể gỡ lỗi = true
Dean Wild

1
@DeanWild - Cảm ơn bạn rất nhiều! Tôi đã cố gắng để nó hoạt động mãi mãi và tiếp tục nhận được "chứng chỉ ssl không hợp lệ" khi gỡ lỗi ứng dụng của mình. Giải pháp này hoạt động như một cơ duyên cho ứng dụng Android của tôi chạy trên Android 9 trên Samsung Note 8.
Dave Black

43

Tôi đã dành rất nhiều thời gian để cố gắng tìm câu trả lời cho điều này (tôi cần Android để xem chứng chỉ StartSSL). Kết luận: Android 2.1 và 2.2 cho phép bạn nhập chứng chỉ, nhưng chỉ để sử dụng với WiFi và VPN. Không có giao diện người dùng để cập nhật danh sách chứng chỉ gốc đáng tin cậy, nhưng có thảo luận về việc thêm tính năng đó. Không rõ liệu có một cách giải quyết đáng tin cậy để cập nhật và thay thế thủ công tệp cacerts.bks hay không.

Chi tiết và liên kết: http://www.mcbsys.com/techblog/2010/12/android-certert/ . Trong bài đăng đó, hãy xem liên kết đến lỗi Android 11231 - bạn có thể muốn thêm phiếu bầu và truy vấn của mình vào lỗi đó.


3
Một nhà phát triển Android đã trả lời lại truy vấn của tôi. cập nhật cacerts.bks: "trong tất cả các bản phát hành mặc dù 2.3, cần có OTA để cập nhật cacerts.bks trên điện thoại chưa root." code.google.com/p/android/issues/detail?id=11231#c25 . OTA = qua không trung, phải không? Đây có thể là lý do tại sao điện thoại của bạn tiếp tục trở lại nhà máy cacerts.bks? Tuy nhiên, nếu bạn có quyền truy cập root, có vẻ như bạn sẽ có thể tải xuống mã nguồn, thêm chứng chỉ của mình, sau đó xây dựng cacerts.bks bằng cách sử dụng tập lệnh certimport.sh. android.git.kernel.org/?p=pl platform / libcore.git ;a= tree ; f=luni/ .
Mark Berry

Cảm ơn. Đây rõ ràng không phải là câu trả lời tôi muốn nghe, nhưng dường như là câu trả lời đúng. Tôi hy vọng rằng có một cách để cài đặt chứng chỉ mà không cần cập nhật toàn bộ hệ thống. Tất nhiên tôi có thể xây dựng các cacerts.bks mới, với quyền truy cập root, tôi thậm chí có thể thay thế cái cũ, nhưng nó trở lại phiên bản gốc với mỗi lần khởi động lại. Không khởi động lại, Android dường như từ chối tải lại tệp chứng chỉ tin cậy.
Bjorn Marschollek

27
Còn việc cài đặt chứng chỉ CA trên nền tảng 3.X và 4.X thì sao?
Alok Kulkarni


16

Nếu bạn cần chứng chỉ cho các kết nối HTTPS, bạn có thể thêm tệp .bks dưới dạng tài nguyên thô vào ứng dụng của mình và mở rộng DefaultHttpConnection để chứng chỉ của bạn được sử dụng cho các kết nối HTTPS.

public class MyHttpClient extends DefaultHttpClient {

    private Resources _resources;

    public MyHttpClient(Resources resources) {
        _resources = resources;
    }

    @Override
    protected ClientConnectionManager createClientConnectionManager() {
        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory
            .getSocketFactory(), 80));
        if (_resources != null) {
            registry.register(new Scheme("https", newSslSocketFactory(), 443));
        } else {
            registry.register(new Scheme("https", SSLSocketFactory
                .getSocketFactory(), 443));
        }
        return new SingleClientConnManager(getParams(), registry);
    }

    private SSLSocketFactory newSslSocketFactory() {
        try {
            KeyStore trusted = KeyStore.getInstance("BKS");
            InputStream in = _resources.openRawResource(R.raw.mystore);
            try {
                trusted.load(in, "pwd".toCharArray());
            } finally {
                in.close();
            }
            return new SSLSocketFactory(trusted);
        } catch (Exception e) {
            throw new AssertionError(e);
        }
    }
}

Cảm ơn vì đã trả lời. Trên thực tế, tôi cần cài đặt chứng chỉ theo cách sao cho mọi ứng dụng trên thiết bị đều tin tưởng vào chứng chỉ. Vấn đề tương tự cũng tồn tại đối với một số CA nhỏ hơn như CAcert, có chứng chỉ không được tin cậy theo mặc định. Làm thế nào để họ cài đặt chứng chỉ của họ?
Bjorn Marschollek

Bạn đã thử: Cài đặt -> Bảo mật -> Cài đặt từ Thẻ SD
Alexander Egger

Ngoài ra, điều này có thể thú vị: android.git.kernel.org/?p=pl
platform / packages / apps / từ

2
Tôi có cùng một vấn đề, tôi phải tải chứng chỉ .PDX X509 bằng ứng dụng Adroid 2.3.3 và sau đó tạo SSL Connection. Bất cứ ai có thể giúp tôi với mã nhận xét?
AndroidLearner

9

Hướng dẫn liên kết tại đây có thể sẽ trả lời câu hỏi ban đầu mà không cần lập trình trình kết nối SSL tùy chỉnh.

Đã tìm thấy một hướng dẫn rất chi tiết về cách nhập chứng chỉ gốc thực sự giúp bạn thông qua việc cài đặt chứng chỉ CA đáng tin cậy trên các phiên bản khác nhau của thiết bị Android (trong số các thiết bị khác).

Về cơ bản bạn sẽ cần:

  1. Tải xuống: tệp cacerts.bks từ điện thoại của bạn.

    adb pull /system/etc/security/cacerts.bks cacerts.bks

  2. Tải xuống tệp .crt từ cơ quan chứng nhận mà bạn muốn cho phép.

  3. Sửa đổi tệp cacerts.bks trên máy tính của bạn bằng Nhà cung cấp BouncyCastle

  4. Tải tập tin cacerts.bks trở lại điện thoại của bạn và khởi động lại.

Dưới đây là từng bước chi tiết hơn để cập nhật các điện thoại Android trước đó: Cách cập nhật kho khóa thẩm quyền chứng chỉ bảo mật HTTPS trên thiết bị tiền android-4.0


5

Có một giải pháp dễ dàng hơn cho vấn đề này hơn là được đăng ở đây, hoặc trong các chủ đề liên quan. Nếu bạn đang sử dụng một webview (như tôi), bạn có thể đạt được điều này bằng cách thực hiện chức năng JAVASCRIPT trong đó. Nếu bạn không sử dụng webview, bạn có thể muốn tạo một ẩn cho mục đích này. Đây là một chức năng hoạt động chỉ trong bất kỳ trình duyệt (hoặc webview) nào để khởi động cài đặt ca (thường thông qua kho lưu trữ chứng chỉ os được chia sẻ, bao gồm cả trên Droid). Nó sử dụng một mẹo hay với iFrames. Chỉ cần chuyển url đến tệp .crt cho chức năng này:

function installTrustedRootCert( rootCertUrl ){
    id = "rootCertInstaller";
    iframe = document.getElementById( id );
    if( iframe != null ) document.body.removeChild( iframe );
    iframe = document.createElement( "iframe" );
    iframe.id = id;
    iframe.style.display = "none";
    document.body.appendChild( iframe );
    iframe.src = rootCertUrl;
}

CẬP NHẬT:

Thủ thuật iframe hoạt động trên Droids với API 19 trở lên, nhưng các phiên bản cũ hơn của webview sẽ không hoạt động như thế này. Ý tưởng chung vẫn hoạt động mặc dù - chỉ cần tải xuống / mở tệp bằng webview và sau đó để os tiếp quản. Đây có thể là một giải pháp dễ dàng và phổ quát hơn (trong java thực tế bây giờ):

 public static void installTrustedRootCert( final String certAddress ){
     WebView certWebView = new WebView( instance_ );
     certWebView.loadUrl( certAddress );
 }

Lưu ý rằng instance_ là một tham chiếu đến Activity. Điều này hoạt động hoàn hảo nếu bạn biết url đến chứng chỉ. Tuy nhiên, trong trường hợp của tôi, tôi giải quyết vấn đề đó một cách linh hoạt với phần mềm phía máy chủ. Tôi đã phải thêm một số lượng mã bổ sung hợp lý để chặn url chuyển hướng và gọi mã này theo cách không gây ra sự cố dựa trên biến chứng luồng, nhưng tôi sẽ không thêm sự nhầm lẫn đó vào đây ...


3

Những gì tôi đã làm để có thể sử dụng chứng chỉ startsl khá dễ dàng. (trên điện thoại đã root của tôi)

Tôi đã sao chép /system/etc/security/cacerts.bks vào sdcard của mình

Đã tải xuống http://www.startssl.com/certs/ca.crthttp://www.startssl.com/certs/sub. Class1.server.ca.crt

Đã đi đến portecle.sourceforge.net và chạy portecle trực tiếp từ trang web.

Đã mở tệp cacerts.bks từ sdcard của tôi (không nhập gì khi được hỏi mật khẩu)

Chọn nhập trong portacle và mở sub. Class1.server.ca.crt, tôi là trường hợp của tôi, tất cả đã có ca.crt nhưng có lẽ bạn cũng cần phải cài đặt nó.

Đã lưu kho khóa và sao chép nó baxck vào /system/etc/security/cacerts.bks (Tôi đã tạo bản sao lưu của tệp đó trước tiên chỉ trong trường hợp)

Khởi động lại điện thoại của tôi và bây giờ tôi có thể kiểm tra trang web của mình bằng chứng chỉ bắt đầu mà không có lỗi.



có ý tưởng nào để đặt cacert.bks trở lại trên thiết bị đã root không?
Bob

1

Những bước này làm việc cho tôi:

  1. Cài đặt ứng dụng Dory Chứng nhận Android trên thiết bị di động của bạn: https://play.google.com/store/apps/details?id=io.tempage.dorycert&hl=en_US
  2. Kết nối thiết bị di động với máy tính xách tay bằng cáp USB.
  3. Tạo thư mục gốc trên bộ nhớ Điện thoại nội bộ, sao chép tệp chứng chỉ trong thư mục đó và ngắt kết nối cáp.
  4. Mở ứng dụng Dory Chứng chỉ Android, nhấp vào nút [+] tròn và chọn tùy chọn Nhập chứng chỉ tệp phù hợp.
  5. Chọn định dạng, cung cấp tên (tôi đã nhập giống như tên tệp), duyệt tệp chứng chỉ và nhấp vào [OK].
  6. Ba thẻ sẽ liệt kê lên. Tôi đã bỏ qua thẻ chỉ có nút [ĐĂNG KÝ CSR] và tiến hành nhấp vào nút [CÀI ĐẶT] trên hai thẻ khác.
  7. Tôi đã làm mới ứng dụng web PWA mà tôi đã mở không có Chrome di động của mình (nó được lưu trữ trên Máy chủ Web IIS cục bộ) và voala! Không có tin nhắn cảnh báo chrome. Các khóa màu xanh lá cây đã ở đó. Nó đã hoạt động.

Ngoài ra, tôi đã tìm thấy các tùy chọn này mà tôi không cần phải tự thử nhưng có vẻ dễ thực hiện:

Cuối cùng, nó có thể không liên quan nhưng, nếu bạn đang muốn tạo và thiết lập chứng chỉ tự ký (với mkcert) cho ứng dụng PWA (trang web) của bạn được lưu trữ trên máy chủ Web IIS cục bộ, tôi đã theo dõi trang này:

https://medium.com/@aweber01/locally-trusty-development-certert-with-mkcert-and-iis-e09410d92031

Cảm ơn và hy vọng nó sẽ giúp !! :)


0

Đây là một giải pháp thay thế thực sự bổ sung chứng chỉ của bạn vào danh sách các chứng chỉ mặc định được tích hợp sẵn: Tin tưởng tất cả các chứng chỉ bằng cách sử dụng HTTPSPS trên HTTPS

Tuy nhiên, nó sẽ chỉ hoạt động cho ứng dụng của bạn. Không có cách nào để lập trình làm điều đó cho tất cả các ứng dụng trên thiết bị của người dùng, vì đó sẽ là một rủi ro bảo mật.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.