如何在Android程序安装CA证书,而无需用户交互(how to install CA certi

2019-06-26 12:42发布

我想不提示用户安装证书。 我知道这是不好的做法,但是这是PM想要什么。

使用KeyChain.createInstallIntent()我可以得到的Android通过调用启动证书安装对话框startActivity 。 然而,当我传球意图sendBroadcast ,没有任何反应。 也许这个平台不支持此出于安全原因?

String CERT_FILE = Environment.getExternalStorageDirectory() + "/test/IAT.crt";
Intent intent = KeyChain.createInstallIntent();
try {
    FileInputStream certIs = new FileInputStream(CERT_FILE);
    byte [] cert = new byte[(int)certFile.length()];
    certIs.read(cert);
    X509Certificate x509 = X509Certificate.getInstance(cert);
    intent.putExtra(KeyChain.EXTRA_CERTIFICATE, x509.getEncoded()); 
    intent.putExtra(KeyChain.EXTRA_NAME, "IAT Cert");
    EapActivity.this.startActivityForResult(intent, 0);  // this works but shows UI
    EapActivity.this.sendBroadcast(intent);  // this doesn't install cert
} catch (IOException e) {

Answer 1:

如果您拥有的系统权限只能安装证书默默。 显示一个确认对话框是故意的,因为信任证书可产生严重的后果 - Android电子可在不发出警告等。这就是说,在ICS对话框愉快打开钓鱼网站/ JB是非常糟糕的 - 它不告诉你什么要安装证书,谁签发的,只是它的CA证书,这是一种明显的。

因此,无论是使用公共KeyChain API和使用startActivity()他们处理给用户之前获得确认对话框,或拨备前的设备。

更新:在Android 4.4系统, DevicePolicyManager有一个隐藏的API( installCaCert ),它允许您以静默安装证书。 您需要MANAGE_CA_CERTIFICATES权限,这是signature|system ,所以还没有可行的用户安装的应用程序。



Answer 2:

使用KeyChain.createInstallIntent() ,我可以得到的Android通过调用startActivity来启动证书安装对话框。 然而,当我传球意图sendBroadcast,没有任何反应。

几乎没有任何Intent将传递到对象startActivity()将与工作sendBroadcast() 他们是准消息总线是独立的渠道Intent系统。



Answer 3:

对于非系统应用程序开发 - 简单的答案是不能没有用户交互来完成。

对于系统应用程序开发人员,我发现下面的解决方案,NB必须运行与系统用户ID的应用程序,并签署利用系统密钥或服务将拒绝您尝试安装证书的应用程序。

第1步 - 创建界面

在项目中创建一个新的包:android.security,然后复制IKeyChainService.aidl到这个包。

第2步 - 绑定到服务并安装证书

该活动提供了如何安装CA证书的例子:

public class KeyChainTest extends Activity {

    private final Object mServiceLock = new Object();
    private IKeyChainService mService;
    private boolean mIsBoundService =false;

    private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override public void onServiceConnected(ComponentName name, 
                                                    IBinder service) {
            synchronized (mServiceLock) {
                mService = IKeyChainService.Stub.asInterface(service);
                mServiceLock.notifyAll();
                try {

                    byte[] result = YOUR_CA_CERT_AS_BYTE_ARRAY

                    //The next line actually installs the certificate
                    mService.installCaCertificate(result);

                } catch (Exception e) {
                    //EXception handling goes here
                }
            }
        }

        @Override public void onServiceDisconnected(ComponentName name) {
            synchronized (mServiceLock) {
                mService = null;
            }
        }
    };

    private void bindService() {
        mIsBoundService = bindService(new Intent(IKeyChainService.class.getName()),
                mServiceConnection,
                Context.BIND_AUTO_CREATE);
    }

    private void unbindServices() {
        if (mIsBoundService) {
            unbindService(mServiceConnection);
            mIsBoundService = false;
        }
    }

    @Override public void onDestroy () {
        unbindServices();
    }


    @Override
    protected void onStart() {
        super.onStart();
        // Bind to KeyChainService
        bindService();
    }
}

我希望这可以帮助别人 - 我花了很长的时间去解决它:)



Answer 4:

如果你有root权限,你可以复制证书文件到/data/misc/user/0/cacerts-added/



Answer 5:

只有系统用户应用程序可以静默安装CA证书。 在棒棒糖不过,谷歌通过DevicePolicyManager介绍无声证书管理API,但你要么必须是Android的换工作的个人资料所有者或设备所有者。



Answer 6:

基于该@ospider的回答,我设法成功地安装像这样的证书:

adb shell mkdir -p /data/misc/user/0/cacerts-added
adb push certificate.cer /data/misc/user/0/cacerts-added/807e3b02.0

# Maybe these two lines are not strictly necessary...
adb shell chmod 644 /data/misc/user/0/cacerts-added/807e3b02.0
adb shell chown system:system /data/misc/user/0/cacerts-added/807e3b02.0

我得到了拷贝文件(名称807e3b02.0通过手动安装我想自动化证书,看到)的Android如何保存它(蒙山adb shell ls -l /data/misc/user/0/cacerts-added/


希望这有助于。

问候。



文章来源: how to install CA certificate programmatically on Android without user interaction