我正在开发一个在 Android 4.0+ 上运行的企业通信应用程序。这个应用程序有一个用 c/c++ 编写的本机传输层,它管理与 SIP 服务器的 SSL 连接。本机层使用 openSSL 库进行 SSL 连接。
当应用程序打开 SSL 连接时,我需要对服务器证书进行验证。这包括根据可用的根 CA 证书和主机名验证验证证书链。我的问题是(我知道)无法访问 Android 信任存储 CA 证书。我的意思是内置证书(例如 Verisign)和用户安装的受信任 CA。
因此,我很确定我要做的就是将证书链传递给 java 代码(这是已实现且有效的),以便我可以使用 java 安全 API。从本质上讲,我必须开始的是 PEM 格式的证书数组(从服务器接收的链)(如果更好的话,可以是 DER)。
我了解如何将链转换为证书对象并将证书对象转换为 CertPath 对象。看起来可以使用 CertPathValidator 来验证 CertPath。我在正确的轨道上吗?我在这里挂断的点是 CertPathValidator.validate(cp,params) 需要一个 PKIXParameters 对象。反过来,这似乎需要一个密钥库或一组 TrustAnchors。我假设密钥库或 TrustAnchors 集代表用于验证 cp(CertPath)的受信任根 CA,对吗?如果是这样,我如何/在哪里获取 PKIXParameters 构造函数的输入参数?
另一方面,我刚刚开始研究是否可以/应该使用 TrustManager 来验证服务器证书。我想我了解 TrustManager 在使用 HTTPSUrlConnection 时是如何适应和使用的,但是当我开始使用我的 PEM 证书数组时,我还不清楚如何做到这一点。
有人可以指出我正确的方向吗?
谢谢,
- 肯