2014年12月8日 星期一

Android的数字证书安装过程概述

http://blog.chinaunix.net/uid-26017891-id-4115659.html

关于证书

        我先去百度了一下数字证书的概念,如下:

        数字证书就是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在Internet上验证通信实体身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构-----CA机构,又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份。数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。

        数字证书的标准,就我所查到的有X.509 v3和GBW标准,目前Android支持X509 V3标准,至于GBW,大家懂的。
        数字证书还有很多的后缀名,这个就不是我这篇文章关心的东西了。

        数字证书是用来做身份认证的,所以手机中会有很多默认安装的证书,这个不要奇怪,因为你登录某些网站,使用某些协议的时候会用到它,虽然你自己本身不清楚在进行操作的时候经过了证书验证你的身份合法性。

简单证书的制作


        为了解证书安装的过程,我们要制作一个证书。根据百度,我成功的找到了如下命令(ubuntu):

keytool -genkeypair -v -alias client -keyalg RSA -storetype PKCS12 -validity 730 -keystore test.p12 -dname "CN=client,OU=IT,O=xxx,L=ANY,ST=bj,C=CN" -storepass 123456 -keypass 123456

        这里就生成了一个test.p12的证书。

        好,现在将它push到手机的SD卡上。

Android证书安装和Settings中对CA与User证书的保存


        当你点击Wi-Fi Settings, Advanced界面的“安装证书;或者在Settings的Security界面下的CredentialStorage界面点击“安装证书”。com.android.certinstaller包中的CertInstallerMain类会收到Settings发送的Credentials.INSTALL_AS_USER_ACTION intent。

        然后,CertInstallerMain类开始创建一个线程,并开始run。在run中,因为收到了Credentials.INSTALL_AS_USER_ACTION intent,CertInstallerMain开始判断SD卡是否存在,这里,我们将证书都push到SD卡里了,SD卡当然是存在的。这种情况下,CertInstallerMain类通过其继承的CertFile类开始读取卡里的所有证书文件。CertFile类读取证书的过程很简单:它把自己设置成了一个FileFilter,在accept方法中,CertFile只接收后缀为Credentials.EXTENSION_CRT, Credentials.EXTENSION_P12, Credentials.EXTENSION_CER, Credentials.EXTENSION_PFX的文件。也就是说当前,Android只支持后缀为crt, p12,cer和pfx的数字证书。

        接着,当SD卡里只有一个证书的时候它弹出一个安装提示框,当SD卡里有一堆证书的时候,它会弹出一个证书,这个列表由CertFileList类维护,放点击某个证书的时候,会和当SD卡里只有一个证书的时候一样,调用installFromFile方法,弹出一个对话框。CertFile的install方法会通知CertInstaller负责证书的安装

        CertFile类对p12证书和其它证书进行了分类,你要是p12证书,我给你个对话框,你输入完密码就OK了。我这里,还使用了WIFI WAP需要的CA证书进行测试。对于CA证书,当你点击弹出对话框的“确认”对应的按钮后,它会通过CredentialHelper类建立一个com.android.credentials.INSTALL intent发给com.android.settings.CredentialStorage类。当CertInstaller类启动后它会直接创建一个CredentialHelper类,CredentialHelper类就直接将安装的证书分类成CA和USER,所以当你点击“认”后,CredentialHelper会将CA证书的信息通过Credentials.EXTRA_CA_CERTIFICATES_NAMECredentials.EXTRA_CA_CERTIFICATES_DATA放到com.android.credentials.INSTALL的intent中。

        最后,Settings收到了这个intent,通过installIfAvailable()方法,将CA证书的信息保存到了KeyStore中。然后,Settings可以通过KeyStore来读取保存的证书。

       以上就是Android的整个证书安装的粗略