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

7

我的目标: 在Android应用程序中以编程方式创建EAP WiFi配置,包括CA证书。

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

我已经找到了一个非常有用的链接,允许我在此处创建和保存EAP WiFi配置: 如何在Android中以编程方式创建和读取WEP/EAP WiFi配置?

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

这个可能吗?(在这种情况下无法获取root权限) 如果可以,怎么办?

附加信息...

我还发现了一种向密钥库添加证书的方法: https://dev59.com/pG855IYBdhLWcg3wPBpx#4490543

但是这仅用于创建安全套接字并通过HTTPS进行连接。我想将证书用于WiFi。


不幸的是,我尚未找到一种通过应用程序编程方式安装CA证书的方法。

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

这个方法有效,但是存在一些挑战:

  • 用户必须命名证书。这是一个挑战,因为我们正在通过编程方式添加WiFi配置。因此,我们必须要求用户给证书赋相同的名称。
  • 用户必须输入密码。如果他们没有设置密码,用户将创建一个并输入两次。如果他们已经设置了安全密码,用户将不得不记住相同的密码并输入它。
  • 假设用户成功完成了这些步骤,他将被留在浏览器中。

这引出了一些问题:

  • 从我的应用程序中,是否有一种方式强制用户为通过浏览器安装的证书命名?
  • 从我的应用程序中,是否有任何方法可以知道证书安装何时完成,然后将焦点返回到我的应用程序?

如果需要澄清,请告诉我。

3个回答

7
由于非系统应用程序无法访问密钥库,因此您无法直接安装它。在ICS上,有一个APIKeyChain.createInstallIntent(),可以启动一个系统对话框询问用户是否要安装证书。在ICS之前,您可以通过直接使用组件名称启动安装意图来实现同样的功能(这可能在所有设备上都起作用,也可能不起作用)。通过浏览器实际上是做同样事情的一种绕路方法。
至于您的问题:
1. 无法指定/强制名称。您为什么关心实际名称?
2. 并不是通过浏览器。如果使用系统意图,则可以返回到您的活动,并在使用startActivityForResult()时得到回调。
更新:Android 4.3具有WifiEnterpriseConfig,它可以创建配置文件并在系统凭据存储中安装键和证书。您只需要CHANGE_WIFI_STATE权限。

嗨,Nikolay,我读了你在这里发布的Keystore文章:- http://nelenkov.blogspot.in/2012/05/storing-application-secrets-in-androids.html。我能否使用此方法通过编程方式将Ca证书从我的应用程序传递到WifiConfiguration类?WifiConfiguration类将引用我的应用程序密钥库而不是系统密钥库。 - Alok Kulkarni

1

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


0
我正在寻找相同的内容...至于你的问题,@Nikolay:
你无法指定/强制名称。为什么你关心实际名称?
EAP配置文件需要已安装CA的名称。如果您查看第4部分中的示例,则可以指定:
final String ENTERPRISE_CA_CERT = "";

在这个例子中,配置文件没有使用CA名称,但其他EAP配置文件可能会使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接