前段时间一直在忙高通项目的需求,同事转给我一个证书安装的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证书安装的大致流程就是这样了。

android ca,Android CA证书安装流程相关推荐

  1. Android 证书安装流程分析

    一.证书在源码中的路径 5.1系统证书(命名是 openssl x509 -subject_hash_old -in filename) libcore/luni/src/main/files/cac ...

  2. android ca证书的安装,如何在Android上以编程方式安装CA证书,无需用户交互

    我试图安装证书而不提示用户.我知道这不是很好的做法,但这就是PM想要的. 使用KeyChain.createInstallIntent(),我可以让Android通过调用startActivity启动 ...

  3. Android——自建CA证书,实现https请求

    Android 使用https 协议请求客户端 server端操作 自己创建 CA 证书 拿自建CA 证书创建 server 端证书 创建 https 服务 Android客户端操作 创建项目并引入相 ...

  4. android安装过程图片,Android的数字证书安装过程概述

    当你点击Wi-Fi Settings, Advanced界面的"安装证书":或者在Settings的Security界面下的CredentialStorage界面点击"安 ...

  5. android 监听本机网络请求_fiddler如何抓取https请求实现fiddler手机抓包-证书安装失败100%解决...

    一.HTTP协议和HTTPS协议. (1) HTTPS协议=HTTP协议+SSL协议,默认端口:443 (2) HTTP协议(HyperText Transfer Protocol):超文本传输协议. ...

  6. Tomcat双向SSL认证及CA数字证书安装和配置QQ即时通信协议窥探

    1.Java加密与解密的艺术 网络信息安全近几年成为热点.职业发展新方向,常规Web应用如BBS.BLOG.SNS及电子商务等B/S系统是以用户为核心,账号管理是这些系统中唯一的安全屏障:IM即时聊天 ...

  7. 【Android 安装包优化】APK 打包流程 ( 文件结构 | 打包流程 | 安装流程 | 安卓虚拟机 )

    文章目录 一.APK 文件结构 二.APK 打包流程 三.APK 安装流程 四.安卓虚拟机 一.APK 文件结构 Android 应用的安装包时 以 " .apk " 为后缀的 A ...

  8. Android 安装apk流程,Android PMS(二)-Apk安装流程

    原创内容,转载请注明出处,多谢配合. 一.APK组成 在APK的安装流程,在此之前先简单了解下APK组成: 目录/文件 描述 assert 存放的原生资源文件,通过AssetManager类访问. l ...

  9. Android中APK安装流程解析

    前言:大家都知道,手机关机以后,就是一个冰冷的砖头,只能用来做防身的利器,但是开机后,点击桌面上的任何一个图片,都能开启一个APP,这说明在开机过程中,系统把已经安装好的APP加载到内存中,这到底是怎 ...

  10. CA、根证书、数字证书、数字证书颁发的流程

    数字证书原理(〇)认识SSL SSL数字证书(一)CA.根证书与数字证书 SSL数字证书(二)使用makecert.exe签发证书 SSL数字证书(三)使用 openssl 生成证书 网络安全无疑是现 ...

最新文章

  1. epoll监听文件_怎么理解把标准输入以ET模式加入epoll,监听EPOLLOUT事件时,epoll_wait多次返回?...
  2. mysql中使用join exists in时该注意的问题
  3. 【数论想法题】小C的问题 @科林明伦杯哈尔滨理工大学第八届程序设计竞赛...
  4. cookie和session、web服务工作原理、Apache配置php扩展、php简介
  5. python 文件服务器
  6. linux 实验指导书,linux操作系统实验指导书新 - 图文
  7. springboot 修改页面不重启
  8. arcgispython空间插值_python2 使用arcpy自定义GIS工具箱,实现excel读取、空间插值
  9. 漫画戏说:如何破解MD5加密算法
  10. NFT头像屡拍天价,如何从理性角度分析其市场价值?
  11. HDU 6411 带劲的and和
  12. 第七章第三十一题(合并两个有序列表)(Merge two ordered tables)
  13. 【算法】时间和空间复杂度
  14. 五脏有问题,该怎么调理?
  15. [html5]离线存储
  16. 上班族适合的兼职副业,副业做什么比较靠谱,副业赚钱的路子有哪些
  17. bandicam屏幕录制
  18. qml 实现按钮样式( 带个小三角)
  19. 用友ERP U8软件安装
  20. 【雷达通信】回波数据处理(Matlab代码实现)

热门文章

  1. LaTeX 页眉设置
  2. WEB应用log4j1.x升级到log4j2.17.1
  3. 网传华为员工未加班领夜宵被冻薪降考评,并终身不得领夜宵
  4. 学习Python的第七天
  5. 【每日一题】一起冲击蓝桥杯吧——Day2【蓝桥真题】
  6. Dolby Digital(Dolby Surround Digital,杜比数码环绕声)
  7. c语言用户登录系统管理员,C语言系统用户管理系统
  8. Microsoft Office XP 智能标记的安装和安全性
  9. 官宣 慧存医疗与泽平科技战略合作1
  10. 怎样的男女才是最合适的