首页 文章

如何以编程方式在Android中安装CA证书(用于EAP WiFi配置)?

提问于
浏览
7

我的目标:在Android programmitcally中创建一个EAP WiFi配置 - 包括CA证书 .

问题:如何以编程方式安装CA证书(然后在EAP WiFi配置中引用该证书)?

我找到了一个非常有用的链接,允许我在这里创建和保存EAP WiFi配置:How to programmatically create and read WEP/EAP WiFi configurations in Android?

但是,假设您已在设备上安装了CA证书 . 我想在我的应用程序中安装证书 - 从应用程序中的资源,或从服务器发送 .

这甚至可能吗? (在这种情况下,生根不是一种选择 . )如果是这样,怎么样?

附加信息...

我还找到了一种向KeyStore添加证书的方法:https://stackoverflow.com/a/4490543/1172101

但是,这专门用于创建安全套接字并通过HTTPS连接 . 我想使用WiFi证书 .


不幸的是,我还没有找到一种以编程方式安装CA证书的方法 - 从应用程序中 .

但是,可以通过Android中的Web浏览器安装证书 . 因此,解决方案(目前)是:启动一个意图,在Web浏览器中打开一个直接转到CA证书的URL .

这有效但有一些挑战:

  • 用户必须为证书命名 . 这是一个挑战,因为我们正在添加WiFi配置程序 . 因此,我们必须要求用户为证书提供相同的名称 .

  • 用户必须输入密码 . 如果他们没有设置密码,用户将创建一个并输入两次 . 如果他们设置了安全密码,则用户必须记住相同的密码并输入密码 .

  • 假设用户成功完成了这些步骤,他将被挂在浏览器中 .

这导致了一些问题:

  • 从我的应用程序中,有没有办法强制用户通过浏览器安装的证书的名称?

  • 从我的应用程序中,有没有办法知道证书安装何时完成,然后将焦点重新放回我的应用程序?

如果您需要任何澄清,请告诉我 .

3 回答

  • 0

    您无法直接安装它,因为非系统应用程序无权访问密钥存储区 . 在ICS上,有一个用于此 KeyChain.createInstallIntent() 的API,它将启动一个系统对话框,询问用户是否要安装证书 . 在ICS之前,您可以通过直接使用组件名称启动安装意图来实现相同的目的(这可能会也可能不适用于所有设备) . 浏览浏览器实际上是一种做同样事情的迂回方式 .

    至于你的问题:

    • 您无法指定/强制名称 . 你为什么关心实际的名字?

    • 不是真的通过浏览器 . 如果您使用系统意图,则可以返回到您的活动,如果您使用 startActivityForResult() ,则会收到回调 .

    更新:Android 4.3具有WifiEnterpriseConfig,它们都会创建配置文件并在系统凭据存储中安装密钥和证书 . 您只需要 CHANGE_WIFI_STATE 权限 .

  • 6

    我正在寻找同样的...至于你的问题,@ Nikolay:

    您无法指定/强制名称 . 你为什么关心实际的名字?

    EAP配置文件需要已安装CA的名称 . 如果您查看第4部分中的示例,您可以指定:

    final String ENTERPRISE_CA_CERT = "";
    

    在该示例中,配置文件不使用CA名称,但其他EAP配置文件可能就是这种情况 .

  • 0

    我目前正在寻求解决同样的问题 . 我发现的最好的事情是KeyChain.choosePrivateKeyAlias()允许用户选择用于SSL的证书 . 从那里,您可以检索别名并将其传递给企业wifi配置 .

相关问题