在Android上以编程方式安装/访问VPN/WIFI证书

4
这是情况:
我正在开发一个应用程序,允许自动管理网络连接。用户可以通过应用程序配置WiFi / VPN配置文件,并且应用程序将管理他们与这些配置文件的连接。
这一切都相当简单(好吧,VPN需要一些反射技巧),除了当我到达需要证书身份验证的网络连接管理点时。问题在于,这些网络大多使用自签名证书,而根据我在Android上遇到的情况,这些证书似乎需要从根证书存储库中访问。我尝试创建一个私有应用程序密钥库,并在那里安装证书,但据我所知,Android的WiFi和VPN部分无法访问此内容。
是否有一种方法可以在应用程序密钥库中安装所选证书,基于此密钥库创建配置文件,然后将已完成的配置文件发送到Android WiFi / VPN管理器以允许预配置的连接?
这似乎应该是可能的,但我还没有足够聪明地使其工作。
更新:
当我尝试创建WiFi和VPN配置时,我已经尝试引用本地应用程序密钥库中安装的证书。似乎在将配置推送到操作系统后无法找到它们。据我理解,一旦安装了证书,它就成为通用密钥库的一部分,无论是在应用程序级别还是在操作系统级别。
我必须保持对证书的访问权限,因此无法将它们推送到SD卡。即使我将它们推送到SD卡,我也无法要求用户手动安装证书,我需要在后台处理以简化配置。我一直在挖掘源代码,但没有找到任何明显的解决方案,但我希望有人之前已经遇到过这个问题,而我只是错过了它。
感谢您的帮助!
更新2:
对于仍然对如何做到这一点感兴趣的人,这里是您需要查看的软件包/类。
com.android.certinstaller.* android.security.Credentials
通过一些挖掘,您可以找到构造意图以安装所需证书的适当方法。
另外,作为侧面说明,如果设备上尚未设置凭据存储密码,则您发出的初始意图以安装证书将仅提示用户提供凭据存储密码。证书将不会安装。可能有一种方法可以解决这个问题,但我还没有找到它。

关于密钥库,我认为应用程序无法访问VPN访问其证书的根密钥库。我认为你能做的最好的事情就是引导用户进入设置屏幕,让他们导入证书。至于自动化VPN设置和连接,我假设你正在使用内部的VpnManager类。你在Android 3.x上测试过你的代码吗?我在2.3上取得了成功,但是相同的代码在平板电脑(3.x)上完全失败 - 只是提供信息。 - Mike Ellery
@Mike 你说得对,应用程序无法访问根密钥库。我试图通过 VPN 绕过这个问题,因为我几乎不得不在我的应用程序中自己编写 VPN 管理器,以模拟内部 VPN 的功能。我基本上构建 VPN 配置并将其作为包裹传递给 Android VPN 服务。在这个包裹中,证书只被别名引用,所以这有点麻烦。此外,我注意到我的 VPN 代码在 Android 3.X 上都无法工作。当尝试连接时它会失败,我还没有找到解决方法。 - Keener
1个回答

6
那是多个问题,请考虑分开处理。你到底尝试了什么?VPN和WiFi不使用常规的Java KeyStore,而是通过密钥库守护程序访问密钥和证书。实际的密钥和证书存储为文件在 /data/misc/keystore 中。据我所知,此API并非公开的,但您可以启动证书安装程序意图,该程序扫描SD卡以获取证书和PFX文件,并安装它们(这也可能不是公开的)。设置->位置和安全->'从SD卡安装'做同样的事情。
简而言之,我认为您无法仅使用SDK API来完成您想要的操作,您必须查看源代码,并冒着您的应用在下一个Android版本中出现故障的风险。
更新:ICS中现在公开了安装程序意图,您可以通过KeyChain类访问它们。

首先,非常感谢您的回复。我应该将它分成VPN功能问题和一般证书问题吗?我将它们放在一起,因为我认为它们密切相关,但我理解您的观点。我会编辑我的问题来回答您的问题。 - Keener
仍然不清楚您所说的“本地应用密钥库”是什么意思。请查看Android源代码树中frameworks/base/keystore/java/android/security目录中与密钥库守护程序交互的一些代码。 - Nikolay Elenkov
1
“本地应用程序密钥库”是指由应用程序创建的密钥库,用于在应用程序空间中持久保存以供私人访问。就凭证源代码而言,我已经找到了一些可行的东西,并可以触发证书安装程序意图,这可能是我必须坚持的。然而,我仍在努力寻找一种安装凭据的方法,无需用户交互或者通过用户交互来控制以简化流程。感谢您的指导! - Keener
我已经成功启动了证书安装程序意图,并直接提供了证书(跳过SD卡)。现在一切似乎都正常工作了。感谢您的帮助! - Keener

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