Android cihaza güvenilir CA sertifikası nasıl kurulur?


134

Kendi CA sertifikamı oluşturdum ve şimdi bunu Android Froyo cihazıma (HTC Desire Z) yüklemek istiyorum, böylece cihaz sertifikama güvenir.

Android, CA sertifikalarını içindeki Java anahtar deposunda saklar /system/etc/security/cacerts.bks. Dosyayı bilgisayarıma kopyaladım, portecle 1.5 kullanarak sertifikamı ekledim ve cihaza geri gönderdim.

Şimdi, Android dosyayı otomatik olarak yeniden yüklemiyor gibi görünüyor. Cihazı yeniden başlatmam gerektiğini birkaç blog gönderisinde okudum. Bunu yapmak, dosyanın yeniden orijinal dosyanın üzerine yazılmasıyla sonuçlanır.

Bir sonraki denemem, sertifikayı SD karttan kopyalayıp ayarlar menüsünden uygun seçeneği kullanarak yüklemekti. Cihaz bana sertifikanın yüklendiğini söylüyor, ancak görünüşe göre sertifikaya güvenmiyor. Dahası, anahtar deposunu bilgisayarıma kopyalamaya çalıştığımda, hala orijinal stoğu buluyorum cacerts.bks.

Peki, kendi kök CA sertifikamı bir Android 2.2 cihazına güvenilir sertifika olarak yüklemenin doğru yolu nedir? Bunu programlı olarak yapmanın bir yolu var mı?


Burada köklü bir telefon olduğunu varsayabilirsiniz. :)
Björn Marschollek

Yanıtlar:


116

Android KitKat'tan önce, yeni sertifikaları yüklemek için cihazınızı köklendirmeniz gerekir.

Android KitKat'tan (4.0) Nougat'a (7.0) kadar bu mümkün ve kolaydır. Köklenmemiş cihazıma Charles Web Hata Ayıklama Proxy sertifikasını yükledim ve SSL trafiğini başarıyla algıladım.

Http://wiki.cacert.org/FAQ/ImportRootCert'den alıntı

Android sürüm 4.0'dan önce, Android sürüm Gingerbread & Froyo ile, tüm CA ('sistem') sertifikalarının varsayılan olarak güvenildiği güven deposunu içeren tek bir salt okunur dosya (/system/etc/security/cacerts.bks) vardı. Android. Hem sistem uygulamaları hem de Android SDK ile geliştirilen tüm uygulamalar bunu kullanır. CAcert sertifikalarını Android Gingerbread, Froyo, ... üzerine yüklemek için bu talimatları kullanın.

Android 4.0'dan (Android ICS / 'Ice Cream Sandwich', Android 4.3 'Jelly Bean' ve Android 4.4 'KitKat') başlayarak, sisteme güvenilen sertifikalar '/ system / etc / klasöründeki (salt okunur) sistem bölümünde yer almaktadır. güvenlik / 'ayrı dosyalar olarak. Bununla birlikte, kullanıcılar artık '/ data / misc / keychain / certs-added' içinde saklanacak olan kendi 'kullanıcı' sertifikalarını kolayca ekleyebilirler.

Sistem tarafından yüklenen sertifikalar, Android cihazında Ayarlar -> Güvenlik -> Sertifikalar -> 'Sistem' bölümünde yönetilebilirken, kullanıcının güvenilen sertifikaları buradaki 'Kullanıcı' bölümünde yönetilir. Kullanıcı tarafından güvenilen sertifikalar kullanılırken Android, Android cihaz kullanıcısını ek güvenlik önlemleri uygulamaya zorlar: Kullanıcı tarafından sağlanan sertifikalar kullanıldığında cihazın kilidini açmak için bir PIN kodu, bir desen kilidi veya şifre kullanılması zorunludur.

CAcert sertifikalarını 'kullanıcı tarafından güvenilen' sertifikalar olarak yüklemek çok kolaydır. Yeni sertifikaları 'güvenilir sistem' sertifikaları olarak yüklemek daha fazla çalışma gerektirir (ve kök erişimi gerektirir), ancak Android kilit ekranı gereksinimini ortadan kaldırma avantajına sahiptir.

Android N'den itibaren biraz daha zorlaşıyor, Charles proxy web sitesinden şu alıntıya bakın :

Android N'den itibaren, Charles SSL Proxying tarafından oluşturulan SSL sertifikalarına güvenmesi için uygulamanıza yapılandırma eklemeniz gerekir. Bu, SSL Proxying'i yalnızca kontrol ettiğiniz uygulamalarla kullanabileceğiniz anlamına gelir.

Uygulamanızı Charles'a güvenecek şekilde yapılandırmak için uygulamanıza bir Ağ Güvenliği Yapılandırma Dosyası eklemeniz gerekir. Bu dosya, sistem varsayılanını geçersiz kılarak uygulamanızın kullanıcı tarafından yüklenen CA sertifikalarına (örneğin Charles Kök Sertifikası) güvenmesini sağlar. Üretim yapılarının varsayılan güven profilini kullanması için bunun yalnızca uygulamanızın hata ayıklama yapılarında geçerli olduğunu belirtebilirsiniz.

Uygulamanıza res / xml / network_security_config.xml dosyası ekleyin:

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

Ardından, uygulamanızın manifest dosyasında aşağıdaki gibi bu dosyaya bir referans ekleyin:

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

1
Özel sertifika dosyalarım ( /system/etc/security/cacerts/*.0) AVD'yi yeniden başlattıktan / yeniden başlattıktan sonra saklanmıyor, bu nedenle bu çözüm başarılı olmadı.
fikr4n

@BornToCode ilginç - AVD'leri nadiren kullanıyorum, bu yüzden bu sınırlamanın farkında değildim
Dean Wild

Ayarı görüyorum, debug-overridesbu network_security_configyalnızca hata ayıklama varyantını hedeflediği anlamına mı geliyor? UAT varyantı gibi başka bir varyantım varsa, bu işe yaramaz mı?
Isaac

1
@Isaac bu, hata ayıklanabilir = doğru olan tüm değişkenler için geçerli olacağı anlamına gelir
Dean Wild

1
@DeanWild - çok teşekkür ederim! Bunu sonsuza kadar çalıştırmaya çalıştım ve uygulamamda hata ayıklarken "geçersiz ssl sertifikası" almaya devam ettim. Bu çözüm, bir Samsung Note 8'de Android 9 üzerinde çalışan Android uygulamam için bir cazibe gibi çalıştı.
Dave Black

43

Buna bir cevap bulmaya çalışırken çok zaman harcadım (StartSSL sertifikalarını görmek için Android'e ihtiyacım var). Sonuç: Android 2.1 ve 2.2, sertifikaları içe aktarmanıza izin verir, ancak yalnızca WiFi ve VPN ile kullanım içindir. Güvenilir kök sertifikaları listesini güncellemek için bir kullanıcı arayüzü yoktur, ancak bu özelliğin eklenmesiyle ilgili tartışma vardır. Cacerts.bks dosyasını manuel olarak güncellemek ve değiştirmek için güvenilir bir geçici çözüm olup olmadığı belirsizdir.

Ayrıntılar ve bağlantılar: http://www.mcbsys.com/techblog/2010/12/android-certificates/ . Bu gönderide, 11231 numaralı Android hatası bağlantısına bakın - oyunuzu eklemek ve bu hataya sorgunuzu eklemek isteyebilirsiniz.


3
Bir Android geliştiricisi sorguma yanıt verdi. update cacerts.bks: "2.3 olmasına rağmen tüm sürümlerde, root olmayan bir telefondaki cacerts.bks'i güncellemek için bir OTA gerekir." code.google.com/p/android/issues/detail?id=11231#c25 . OTA = havadan, değil mi? Telefonunuzun fabrika cacerts.bks'ye dönmesinin nedeni bu olabilir mi? Ancak kök erişiminiz varsa, kaynak kodunu indirebilmeniz, sertifikanızı ekleyebilmeniz ve ardından certimport.sh komut dosyasını kullanarak cacerts.bks oluşturabilmeniz gerekir. android.git.kernel.org/?p=platform/libcore.git;a=tree;f=luni/… .
Mark Berry

Teşekkürler. Açıkçası bu, duymak istediğim cevap değildi, ancak doğru cevap gibi görünüyor. Tüm sistemi güncellemeden bir sertifika yüklemenin bir yolu olduğunu umuyordum. Elbette yeni cacerts.bks'i oluşturabilirim, root erişimi ile eskisini bile değiştirebilirim, ancak her yeniden başlatmada orijinal sürüme geri döner. Yeniden başlatmadan, Android güvenilir sertifikalar dosyasını yeniden yüklemeyi reddediyor gibi görünüyor.
Björn Marschollek

27
CA sertifikalarını 3.X ve 4.X platformlarına yüklemeye ne dersiniz?
Alok Kulkarni


16

HTTPS bağlantıları için sertifikanıza ihtiyacınız varsa, .bks dosyasını uygulamanıza ham kaynak olarak ekleyebilir ve DefaultHttpConnection'ı genişletebilir, böylece sertifikalarınız HTTPS bağlantıları için kullanılır.

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);
        }
    }
}

Cevabın için teşekkürler. Aslında sertifikayı cihazdaki her uygulamanın sertifikaya güveneceği şekilde yüklemem gerekiyor. Aynı sorun, sertifikalarına varsayılan olarak güvenilmeyen CAcert gibi bazı daha küçük CA'lar için de mevcut olmalıdır. Sertifikalarını nasıl yüklerler?
Björn Marschollek

Denediniz mi: Ayarlar -> Güvenlik -> SD Karttan Yükle
Alexander Egger


2
Aynı sorunu yaşıyorum, Adroid 2.3.3 uygulamasını kullanarak bir .PDX X509 sertifikası yüklemem ve ardından SSL Bağlantısı oluşturmam gerekiyor. Yorumlu kod konusunda bana yardımcı olan var mı?
AndroidLearner

9

Buraya bağlanan kılavuz , muhtemelen özel bir SSL konektörü programlamaya gerek kalmadan orijinal soruyu cevaplayacaktır.

Android cihazların farklı sürümlerine (diğer cihazların yanı sıra) güvenilen CA sertifikalarını yükleme konusunda sizi gerçekten yönlendiren kök sertifikaları içe aktarma konusunda çok ayrıntılı bir nasıl yapılır kılavuzu buldum.

Temel olarak yapmanız gerekenler:

  1. İndirin: telefonunuzdan cacerts.bks dosyası.

    adb çekme /system/etc/security/cacerts.bks cacerts.bks

  2. .Crt dosyasını izin vermek istediğiniz sertifika yetkilisinden indirin.

  3. BouncyCastle Sağlayıcısını kullanarak bilgisayarınızdaki cacerts.bks dosyasını değiştirin

  4. Cacerts.bks dosyasını telefonunuza geri yükleyin ve yeniden başlatın.

Daha önceki Android telefonları güncellemek için adım adım daha ayrıntılı bir adım: Android 4.0 öncesi cihazda HTTPS güvenlik sertifikası yetkili anahtar deposu nasıl güncellenir?


5

Burada ya da ilgili başlıklarda yayınlanandan çok daha kolay bir çözüm var. Bir web görünümü kullanıyorsanız (benim gibi), bunu içinde bir JAVASCRIPT işlevi çalıştırarak gerçekleştirebilirsiniz. Bir web görünümü kullanmıyorsanız, bu amaç için gizli bir tane oluşturmak isteyebilirsiniz. İşte ca kurulumunu başlatmak için hemen hemen her tarayıcıda (veya web görünümünde) çalışan bir işlev (genellikle bir Droid dahil olmak üzere paylaşılan işletim sistemi sertifika deposu aracılığıyla). İFrames ile güzel bir numara kullanıyor. URL'yi bir .crt dosyasına bu işleve aktarmanız yeterlidir:

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;
}

GÜNCELLEME:

İframe hilesi, API 19 ve üstü olan Droid'lerde çalışır, ancak web görünümünün eski sürümleri bu şekilde çalışmayacaktır. Genel fikir hala işe yarıyor - dosyayı bir web görünümüyle indirin / açın ve ardından işletim sisteminin devralmasına izin verin. Bu daha kolay ve daha evrensel bir çözüm olabilir (şimdi gerçek java'da):

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

İnstance_'nin Aktiviteye bir referans olduğunu unutmayın. Sertifikanın url'sini biliyorsanız bu mükemmel çalışır. Ancak benim durumumda bunu sunucu tarafı yazılımıyla dinamik olarak çözüyorum. Bir yönlendirme url'sini kesmek için makul miktarda ek kod eklemem ve bunu bir iş parçacığı komplikasyonuna dayalı bir çökmeye neden olmayacak şekilde çağırmam gerekiyordu, ancak tüm bu karışıklığı buraya eklemeyeceğim ...


3

Startsl sertifikalarını kullanabilmek için yaptığım şey oldukça kolaydı. (köklü telefonumda)

/System/etc/security/cacerts.bks'i sd kartıma kopyaladım

İndirilen http://www.startssl.com/certs/ca.crt ve http://www.startssl.com/certs/sub.class1.server.ca.crt

Portecle.sourceforge.net'e gittim ve portecle'i doğrudan web sayfasından çalıştırdı.

Cacerts.bks dosyamı sdcard'ımdan açtım (şifre sorulduğunda hiçbir şey girilmedi)

Portacle'da içe aktarmayı seçin ve sub.class1.server.ca.crt dosyasını açın, benim durumumda zaten ca.crt vardı ama belki onu da yüklemeniz gerekiyor.

Anahtar deposunu kaydetti ve baxck'ı /system/etc/security/cacerts.bks'e kopyaladım (her ihtimale karşı önce bu dosyanın bir yedeğini aldım)

Telefonumu yeniden başlattım ve artık hatasız bir beginsl sertifikası kullanarak sitemi ziyaret edebilirim.



cacert.bks'i köklü olmayan bir cihaza nasıl geri koyacağınıza dair bir fikriniz var mı?
Bob

1

Bu adımlar benim için çalıştı:

  1. Dory Certificate Android uygulamasını mobil cihazınıza yükleyin: https://play.google.com/store/apps/details?id=io.tempage.dorycert&hl=en_US
  2. USB Kablosu ile mobil cihazı dizüstü bilgisayara bağlayın.
  3. Dahili Telefon belleğinde kök klasör oluşturun, sertifika dosyasını bu klasöre kopyalayın ve kabloyu çıkarın.
  4. Dory Sertifikası Android uygulamasını açın, yuvarlak [+] düğmesine tıklayın ve doğru Dosya Sertifikasını İçe Aktar seçeneğini seçin.
  5. Biçimi seçin, bir ad sağlayın (dosya adıyla aynı yazdım), sertifika dosyasına göz atın ve [Tamam] 'a tıklayın.
  6. Üç kart listelenecek. Yalnızca [SIGN CSR] düğmesine sahip olan kartı görmezden geldim ve diğer iki karttaki [INSTALL] düğmesine tıklamaya başladım.
  7. Açmamış olduğum PWA web uygulamasını yeniledim mobil Chrome'umu (yerel bir IIS Web Sunucusunda barındırılıyor) ve işte! Krom uyarı mesajı yok. Yeşil kilit oradaydı. Çalışıyordu.

Alternatif olarak, kendim denememe gerek duymadığım ancak takip etmesi kolay görünen şu seçenekleri buldum:

Son olarak, alakalı olmayabilir, ancak yerel bir IIS Web sunucusunda barındırılan PWA uygulamanız (web sitesi) için kendinden imzalı bir sertifika (mkcert ile) oluşturmak ve kurmak istiyorsanız, şu sayfayı takip ettim:

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

Teşekkürler ve umarım yardımcı olur !! :)



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.