android ca,Android CA证书安装流程

2023-05-16

前段时间一直在忙高通项目的需求,同事转给我一个证书安装的bug给我,一直没时间解,给Marvell提case,个把月了还不给回复,囧!求人不如求己正好最近需求做完了,索性就自己跟下代码。

证书安装入口在设置-->安全里,相应代码如下:

android:title="@string/credentials_install"

android:summary="@string/credentials_install_summary"

android:persistent="false">

android:targetPackage="com.android.certinstaller"

android:targetClass="com.android.certinstaller.CertInstallerMain"/>

当我们点击“从存储设备安装证书”时,就会通过intent进入CertInstallerMain。在onCreate里对相应action做处理

if (Credentials.INSTALL_ACTION.equals(action)

|| Credentials.INSTALL_AS_USER_ACTION.equals(action)) {

Bundle bundle = intent.getExtras();//这里获取的bundle为空。

由于bundle未空会执行如下代码:

if (bundle == null

|| bundle.isEmpty()

|| (bundle.size() == 1

&& (bundle.containsKey(KeyChain.EXTRA_NAME)

|| bundle.containsKey(Credentials.EXTRA_INSTALL_AS_UID)))) {

final Intent openIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);

openIntent.setType("*/*");

openIntent.putExtra(Intent.EXTRA_MIME_TYPES, ACCEPT_MIME_TYPES);

openIntent.putExtra(DocumentsContract.EXTRA_SHOW_ADVANCED, true);

startActivityForResult(openIntent, REQUEST_OPEN_DOCUMENT);

这里就会弹出一个类似文件管理的界面,选择相应的证书后会自动安装证书。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode == REQUEST_OPEN_DOCUMENT) {

if (resultCode == RESULT_OK) {

startInstallActivity(null, data.getData());

} else {

finish();

}

} else if (requestCode == REQUEST_INSTALL) {

setResult(resultCode);

finish();

} else {

Log.w(TAG, "unknown request code: " + requestCode);

}

}

private void startInstallActivity(String mimeType, byte[] value) {

Intent intent = new Intent(this, CertInstaller.class);

if ("application/x-pkcs12".equals(mimeType)) {

intent.putExtra(KeyChain.EXTRA_PKCS12, value);

} else if ("application/x-x509-ca-cert".equals(mimeType)

|| "application/x-x509-user-cert".equals(mimeType)

|| "application/x-x509-server-cert".equals(mimeType)

|| "application/x-pem-file".equals(mimeType)

|| "application/pkix-cert".equals(mimeType)) {

intent.putExtra(KeyChain.EXTRA_CERTIFICATE, value);

} else {

throw new IllegalArgumentException("Unknown MIME type: " + mimeType);

}

startActivityForResult(intent, REQUEST_INSTALL);

}

进入CertInstaller后,如果没有设置设置锁屏会先提示设置锁屏

protected void onCreate(Bundle savedStates) {

super.onCreate(savedStates);

mCredentials = createCredentialHelper(getIntent());

mState = (savedStates == null) ? STATE_INIT : STATE_RUNNING;

if (mState == STATE_INIT) {

if (!mCredentials.containsAnyRawData()) {

toastErrorAndFinish(R.string.no_cert_to_saved);

finish();

} else if (mCredentials.hasPkcs12KeyStore()) {

showDialog(PKCS12_PASSWORD_DIALOG);

} else {

MyAction action = new InstallOthersAction();

if (needsKeyStoreAccess()) {

sendUnlockKeyStoreIntent();

mNextAction = action;

} else {

action.run(this);

}

}

设置完成后在进行证书安装

protected void onResume() {

super.onResume();

if (mState == STATE_INIT) {

mState = STATE_RUNNING;

} else {

if (mNextAction != null) {

mNextAction.run(this);

}

}

}

最终会调用installOthers()方法

if (mCredentials.hasKeyPair()) {             saveKeyPair();             finish();         } else {             X509Certificate cert = mCredentials.getUserCertificate();             if (cert != null) {                 // find matched private key                 /* modify by yangzhiming 20150803 for bug 60294 start */                 String key = null;                 try{                     key = Util.toMd5(cert.getPublicKey().getEncoded());                 }catch (RuntimeException ex) {                     toastErrorAndFinish(R.string.invalid_cert);                     return;                 }                 /* modify by yangzhiming 20150803 for bug 60294 end */                 Map map = getPkeyMap();                 byte[] privatekey = map.get(key);                 if (privatekey != null) {                     Log.d(TAG, "found matched key: " + privatekey);                     map.remove(key);                     savePkeyMap(map);                     mCredentials.setPrivateKey(privatekey);                 } else {                     Log.d(TAG, "didn't find matched private key: " + key);                 }             }             nameCredential();         }     CA证书安装的大致流程就是这样了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android ca,Android CA证书安装流程 的相关文章

  • 在 Android 中使用 awt

    我有一个绘制图表的 Java Swing 应用程序 它使用 Graphics2D 调用和 awt 对象 例如 Rectangle 等 在某些时候我可能想将其移植到 Android 上 我知道我无法在 Android 上使用 Graphics
  • 升级到 Proguard 4.8 后无法导出应用程序

    我刚刚将我的 Android SDK ADT 和 Proguard 升级到最新最好的版本 我的项目在调试模式下编译并运行良好 但是当我尝试导出它的签名版本 APK 时 我收到来自导出向导的错误Eclipse 控制台上没有任何错误日志消息 如
  • 在 Android 市场中以编程方式检查我的应用程序版本

    目前 我正在启动时检查应用程序版本代码 并将其与我的服务器上的最新版本代码进行匹配 并根据此匹配 我发送用户从 Android 市场获取最新更新 它运行良好 但我的问题是我必须手动更改服务器上的最新版本代码 并且我不知道新版本何时发布APK
  • 与通用地图相比,MapView 的分辨率较差

    我刚刚收到 HTC Desire 进行测试 我注意到 残留在小于整个屏幕的框架中的地图视图不如通用地图应用程序那么清晰 有什么办法解决这个问题吗 您应该使用 API 级别 4 或更高级别编译应用程序 然后在 AndroidManifest
  • 不使用eclipse安装Android模拟器

    如何在没有eclipse的电脑上安装android模拟器 android模拟器无需安装eclipse 只需下载 android sdk 并安装即可 安装android SDK之前必须先安装JDK 完成后安装成功 您将获得两个应用程序 SDK
  • 如何在 Android 中创建始终位于顶部的全屏覆盖 Activity

    我希望能够创建一个始终位于 Android 显示前面的 Activity 它不应该接收任何输入 只需将其传递到其下面的任何应用程序即可 像平视显示器之类的东西 我能够研究我需要将底层窗口类型设置为 TYPE SYSTEM ALERT 但看起
  • 在活动启动期间优雅地处理屏幕方向变化

    我正在尝试找到一种方法来正确处理设置活动 其中活动的方向是根据启动它的意图中的数据确定的 这是一款用户可以选择关卡的游戏 其中一些是纵向的 一些是横向的 我面临的问题是setRequestedOrientation ActivityInfo
  • MediaPlayer.create() 始终返回 null

    我以前用过媒体播放器 从来没有遇到过这个问题 每当我尝试使用 MediaPlayer create 时 该方法都会给我 null 并且我无法播放声音 我有什么遗漏的吗 public class Game extends Activity p
  • Android 游戏偶尔出现延迟

    我正在用 Java 制作一个简单的 Android 游戏 我注意到每 20 40 秒就会出现一些烦人的延迟 首先 我认为它们是由垃圾收集器引起的 但当我检查 LogCat 时 我发现游戏滞后时没有垃圾收集 每当游戏开始滞后时 我都会标记日志
  • Android Studio APK META-INF/BCKEY.DSA 中复制的重复文件

    我的代码构建得很好 但是当我尝试在调试中运行它时 出现以下错误 Error Execution failed for task app transformResourcesWithMergeJavaResForDebug com andro
  • 旋转 Google 地图中的两层标记图标

    在我的应用程序中 我向地图添加了一定数量的标记 如下所示 private fun addMarker googleMap GoogleMap location Location val options MarkerOptions optio
  • 添加 play-services-maps 依赖项自动添加 glEsVersion 2.0 要求

    我想融入Google Play Services Maps module 由于地图清单声明
  • Android中如何使用intent加载本地html页面?

    我的 asset 目录中有一个 html 文件 我必须使用 Intent 将其加载为浏览器应用程序 这是我的代码 但它不起作用 startActivity new Intent Intent ACTION VIEW Uri parse fi
  • 使用 twitter API 1.1 在 Android 应用程序中显示 twitter feed

    基本上我想展示这个提要 https en twitter com epl live https en twitter com epl live在我的应用程序中 由于 twitter 更改了其 api 1 1 每个调用都必须经过授权 我发现的
  • Grade Plugin 3-alpha1 输出文件导致错误

    我正在尝试将项目更新到 Android Studio 3 build gradle 文件中不再接受以下代码片段 applicationVariants all variant gt variant outputs each out gt d
  • Android - 检测视图上的双击和三次点击

    我一直在尝试构建一个可以检测双敲击和三敲击的敲击检测器 在我的努力失败后 我在网上搜索了很长时间以找到可以使用的东西 但没有运气 奇怪的是 像这样的图书馆如此稀缺 有什么帮助吗 你可以尝试这样的事情 尽管我通常建议不要使用三次点击作为一种模
  • JavaScript 点击事件在 Android 4.0.4 默认浏览器上的 Samsung Galaxy SIII 上不起作用

    我在 Android 4 0 4 上使用 Samsung Galaxy SIII 的默认浏览器时遇到了最奇怪的问题 对于以下页面 单击链接将不会触发 JavaScript 处理程序 从其中一个 div 的内容中删除单个 a 字母使它们再次工
  • 在 VideoView 开始播放之前,TextView 不会显示

    我编写了一个android应用程序 它有两个视图 TextView上方的VideoView 位于ScrollView内部 我遇到了一个问题 直到VideoView开始播放视频 TextView才显示 并且我有一个黑屏 这可能需要很长一段时间
  • 片段中的 SavedInstanceState 始终为 null

    我使用 XML 以及活动中的 setContentView 将片段附加到活动 A 有一个问题 因为我的片段中有非常动态的视图 所以当方向改变时 我必须恢复所有的观点状态 我有问题 因为我正在使用类似的东西 public void onSav
  • FCM(Firebase Cloud Messaging)如何发送到所有手机?

    我创建了一个小型应用程序 能够从 FCM 控制台接收推送通知 我现在想做的是向所有使用 API 安装应用程序的 Android 手机发送推送通知 这就是我完全迷失的地方 有没有办法在不收集所有注册ID的情况下将其发送到所有手机 这是否仅适用

随机推荐