日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Android證書安裝過程介紹_Android

作者:z9722 ? 更新時間: 2021-12-07 編程語言

一.證書在源碼中的路徑

5.1系統證書(命名是 openssl x509 -subject_hash_old -in filename)

libcore/luni/src/main/files/cacerts

7.1及以后系統證書

/system/ca-certificates/files

二.證書在固件中的路徑

/system/etc/security/cacerts

三.手動安裝流程

設置-->安全-->從SD卡安裝證書:

在AndroidManif.xml里

<Preference android:key="credentials_install"
        android:title="@string/credentials_install"
        android:summary="@string/credentials_install_summary"
        android:persistent="false">
    <intent android:action="android.credentials.INSTALL"
            android:targetPackage="com.android.certinstaller"
            android:targetClass="com.android.certinstaller.CertInstallerMain"/>
</Preference>

packages/apps/CertInstaller

CertInstallerMain打開Document,選擇證書文件,選擇好后。啟動CerInstaller

然后根據證書類型區分createPkcs12PasswordDialog和createNameCredentialDialog,看個簡單的createNameCredentialDialog

try {
    startActivityForResult(
            mCredentials.createSystemInstallIntent(),   //Intent intent = new Intent("com.android.credentials.INSTALL");
            REQUEST_SYSTEM_INSTALL_CODE);
} catch (ActivityNotFoundException e) {
    Log.w(TAG, "systemInstall(): " + e);
    toastErrorAndFinish(R.string.cert_not_saved);
}

看intent,又到了Settings的CredentialStorage

Settings/src/com/android/settings/CredentialStorage.java ? ?installIfAvailable

添加證書:Settings/src/com/android/settings/CredentialStorage.java ? ?installIfAvailable()

刪除證書:Settings/src/com/android/settings/TrustedCredentialsSettings.java ? AliasOperation#doInBackground

顯示證書:Settings/src/com/android/settings/TrustedCredentialsSettings.java ? AdapterData#AliasLoader#doInBackground ??

證書內容:Settings/src/com/android/settings/TrustedCredentialsSettings.java ?CertHolder ?SslCertificate

安裝類型兩種: userKey和Ca證書(pk12要處理密碼)

CertInstaller\src\com\android\certinstaller\CredentialHelper.java

異常碼:

機器未設置密碼鎖

機器未解鎖

鎖屏方式不符合要求還是packages/apps/CertInstaller/CertInstallerMain,startActivityForResult結果回調

if (requestCode == REQUEST_SYSTEM_INSTALL_CODE) {
    if (resultCode == RESULT_OK) {
        Log.d(TAG, "credential is added: " + mCredentials.getName());
        Toast.makeText(this, getString(R.string.cert_is_added,
                mCredentials.getName()), Toast.LENGTH_LONG).show();
 
        if (mCredentials.hasCaCerts()) {
            // more work to do, don't finish just yet
            new InstallCaCertsToKeyChainTask().execute();
            return;
        }
        setResult(RESULT_OK);
    } else {
        Log.d(TAG, "credential not saved, err: " + resultCode);
        toastErrorAndFinish(R.string.cert_not_saved);
    }
}

如果是CaCerts,還要進行 new InstallCaCertsToKeyChainTask().execute() --> mCredentials.installCaCertsToKeyChain --> keyChainService.installCaCertificate

keyChainService實現在packages/apps/KeyChain ?mTrustedCertificateStore.installCertificate

external/conscrypt/src/platform/java/org/conscrypt/TrustedCertificateStore ? installCertificate --> writeCertificate

四.c層

system/security/keystore/keystore.cpp

添加證書 ?installIfAvailable -> mKeyStore.put -> mBinder.insert (這里還是java層)
-> KeyStoreProxy::insert -> KeyStore::put ?(這里getEncryptionKey用到一個AESkey,哪里來的?)

五.為什么要鎖屏密碼

以設置密碼為例
Settings/src/com/android/settings/ChooseLockPassword.java ?mLockPatternUtils.saveLockPassword
frameworks/base/core/java/com/android/internal/widget/LockPatternUtils.java ?getLockSettings().setLockPassword
frameworks/base/services/core/java/com/android/server/LockSettingsService.java ?setLockPassword -> maybeUpdateKeystore ?-> ks.passwordUid
-> 到keystore.cpp的password_uid?

password_uid 有三種狀態,其中STATE_UNINITIALIZED和STATE_LOCKED都會調用setupMasterKeys,經鎖屏密碼設置AESkey
這里就解答了添加證書時的AESKey是哪來的

這個是基于Android5.1分析的,高版本可能文件名不同,但是知道大概位置,搜索下,應該沒什么難度? ? ? ??

原文鏈接:https://blog.csdn.net/z9722/article/details/121752677

欄目分類
最近更新