【问题标题】:Installing/Accessing Certs for VPN/WIFI programmatically on Android在 Android 上以编程方式安装/访问 VPN/WIFI 的证书
【发布时间】:2011-11-13 22:22:15
【问题描述】:

情况如下:

我正在开发一个允许自动管理网络连接的应用程序。用户可以通过应用程序配置 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 您说得对,因为应用程序无权访问根密钥库。我试图通过 VPN 找到解决此问题的方法,因为我几乎必须在我的应用程序中推出自己的 VPN 管理器,以反映内部管理器的功能。我基本上构建了 VPN 配置并将它们作为包裹扔给 Android VPN 服务。在这个包裹中,证书仅通过别名引用,所以这有点麻烦。此外,对于 Android 3.X,我注意到我的 VPN 代码都不起作用。尝试连接时它只是失败了,我还没有找到解决方法。

标签: android security certificate wifi vpn


【解决方案1】:

这不止一个问题,考虑拆分它。你到底试过什么? VPN 和 WiFi 不使用常规的 Java KeyStore,通过密钥库守护进程访问密钥和证书。实际的密钥和证书作为文件存储在/data/misc/keystore 中。 AFAIK 对此的 API 不公开,但您可能会启动证书安装程序意图,它会扫描 SD 卡中的证书和 PFX 文件,并安装它们(这也可能不公开)。设置->位置和安全->“从 SD 卡安装”做同样的事情。

简而言之,我认为您无法仅使用 SDK API 完成您想做的事情,您必须查看源代码,并冒着应用在下一个 Android 版本中崩溃的风险。

更新:安装程序意图现在在 ICS 中公开,您可以通过 KeyChain 类访问它们。

【讨论】:

  • 首先,非常感谢您的回复。我应该把它分成 VPN 功能问题和一般证书问题吗?我把它们放在一起是因为我认为它们密切相关,但我明白你的意思。我将编辑我的问题以解决您的问题。
  • 仍然不清楚“本地应用程序密钥库”是什么意思。在 Android 源代码树的 frameworks/base/keystore/java/android/security 目录中查找一些与 keystore 守护进程交互的代码。
  • “本地应用程序密钥库”是指由应用程序创建的用于私有访问的密钥库,并保留在应用程序空间中。就凭证源代码而言,我发现了一些可行的东西并且可以触发证书安装程序的意图,这可能是我必须坚持的。但是,我仍在尝试找到一种无需用户交互或通过我可以控制的用户交互来简化流程的凭据安装方法。感谢您的指导!
  • 我能够启动证书安装程序意图并直接向其提供证书(跳过 sd 卡)。现在一切似乎都正常了。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2012-02-19
  • 2012-09-29
  • 2017-02-08
  • 2021-11-05
  • 2010-11-28
  • 2012-10-09
  • 1970-01-01
  • 2020-06-12
相关资源
最近更新 更多