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

我的目标是:在Android上编程创build一个EAP WiFiconfiguration – 包括CA证书。

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

我发现一个非常有用的链接已经允许我在这里创build和保存EAP WiFiconfiguration: 如何以编程方式创build和阅读Android中的WEP / EAP WiFiconfiguration?

但是,这假定您已经在设备上安装了CA证书。 我想在我的应用程序中安装证书 – 无论是从应用程序的资源,或从服务器发送。

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

附加信息…

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

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


不幸的是,我还没有find一种方法来从程序中以编程方式安装CA证书。

但是,可以通过Android中的Web浏览器安装证书。 因此,解决scheme(现在)是:启动在Web浏览器中打开直接到CA证书的URL的意图。

这工作,但有一些挑战:

  • 用户必须命名证书。 这是一个挑战,因为我们正在编程添加WiFiconfiguration。 因此,我们不得不要求用户给出相同的名称。
  • 用户必须input密码。 如果他们没有设置密码,用户将创build一个并input两次。 如果他们设置了安全密码,用户将不得不记住相同的密码并input。
  • 假设用户成功完成这些步骤,他将被挂在浏览器中。

这导致了几个问题:

  • 从我的应用程序,有没有办法强制用户通过浏览器安装证书的名称?
  • 从我的应用程序,有什么办法知道什么时候证书安装已经完成,然后把焦点回到我的应用程序?

只要让我知道,如果你需要任何澄清。

Solutions Collecting From Web of "如何以编程方式在Android中安装CA证书(用于EAP WiFiconfiguration)?"

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

至于你的问题:

  1. 你不能指定/强制一个名字。 你为什么关心实际的名字?
  2. 不是真的通过浏览器。 如果您使用系统意图,则可以返回到您的活动,如果使用startActivityForResult() ,将会得到一个callback。

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

我正在寻找同样的…至于你的问题,@尼科莱:

你不能指定/强制一个名字。 你为什么关心实际的名字?

EAPconfiguration文件需要已经安装的CA的名称。 如果你看看第四部分的例子,你可以指定:

 final String ENTERPRISE_CA_CERT = ""; 

在该示例中,configuration文件不使用CA名称,但其他EAPconfiguration文件可能是这种情况。

我目前正在寻求解决相同的问题。 我发现的最好的事情是KeyChain.choosePrivateKeyAlias()允许用户select哪个证书用于SSL。 从那里你可以检索别名,并将其传递给企业的WiFiconfiguration。